CustomWeakForm(double mu_r, double kappa) : WeakForm(1) { cplx ii = cplx(0.0, 1.0); // Jacobian. add_matrix_form(new WeakFormsHcurl::DefaultJacobianCurlCurl(0, 0, HERMES_ANY, 1.0/mu_r)); add_matrix_form(new WeakFormsHcurl::DefaultMatrixFormVol(0, 0, HERMES_ANY, -sqr(kappa))); add_matrix_form_surf(new WeakFormsHcurl::DefaultMatrixFormSurf(0, 0, HERMES_ANY, -kappa*ii)); // Residual. add_vector_form(new WeakFormsHcurl::DefaultResidualCurlCurl(0, HERMES_ANY, 1.0/mu_r)); add_vector_form(new WeakFormsHcurl::DefaultResidualVol(0, HERMES_ANY, -sqr(kappa))); add_vector_form_surf(new WeakFormsHcurl::DefaultResidualSurf(0, HERMES_ANY, -kappa*ii)); add_vector_form_surf(new CustomVectorFormSurf()); };
CustomWeakFormHeatRK::CustomWeakFormHeatRK(std::string bdy_air, double alpha, double lambda, double heatcap, double rho, double* current_time_ptr, double temp_init, double t_final) : WeakForm<double>(1) { // Jacobian volumetric part. add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0, HERMES_ANY, new Hermes1DFunction<double>(-lambda / (heatcap * rho)))); // Jacobian surface part. add_matrix_form_surf(new DefaultMatrixFormSurf<double>(0, 0, bdy_air, new Hermes2DFunction<double>(-alpha / (heatcap * rho)))); // Residual - volumetric. add_vector_form(new DefaultResidualDiffusion<double>(0, HERMES_ANY, new Hermes1DFunction<double>(-lambda / (heatcap * rho)))); // Residual - surface. add_vector_form_surf(new CustomFormResidualSurf(0, bdy_air, alpha, rho, heatcap, current_time_ptr, temp_init, t_final)); }
CustomWeakForm::CustomWeakForm(Hermes::vector<std::string> newton_boundaries, double heatcap, double rho, double tau, double lambda, double alpha, double temp_ext, Solution<double>* sln_prev_time, bool JFNK) : WeakForm<double>(1, JFNK) { // Jacobian forms - volumetric. add_matrix_form(new JacobianFormVol(0, 0, heatcap, rho, lambda, tau)); // Jacobian forms - surface. add_matrix_form_surf(new JacobianFormSurf(0, 0, newton_boundaries, alpha, lambda)); // Residual forms - volumetric. ResidualFormVol* res_form = new ResidualFormVol(0, heatcap, rho, lambda, tau); res_form->ext.push_back(sln_prev_time); add_vector_form(res_form); // Residual forms - surface. add_vector_form_surf(new ResidualFormSurf(0, newton_boundaries, alpha, lambda, temp_ext)); }
CustomWeakFormPoissonNewton::CustomWeakFormPoissonNewton(std::string mat_al, Hermes::Hermes1DFunction<double>* lambda_al, std::string mat_cu, Hermes::Hermes1DFunction<double>* lambda_cu, Hermes::Hermes2DFunction<double>* vol_src_term, std::string bdy_heat_flux, double alpha, double t_exterior) : Hermes::Hermes2D::WeakForm<double>(1) { // Jacobian forms - volumetric. add_matrix_form(new Hermes::Hermes2D::WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_al, lambda_al)); add_matrix_form(new Hermes::Hermes2D::WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_cu, lambda_cu)); // Jacobian forms - surface. add_matrix_form_surf(new Hermes::Hermes2D::WeakFormsH1::DefaultMatrixFormSurf<double>(0, 0, bdy_heat_flux, new Hermes::Hermes2DFunction<double>(alpha))); // Residual forms - volumetric. add_vector_form(new Hermes::Hermes2D::WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_al, lambda_al)); add_vector_form(new Hermes::Hermes2D::WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_cu, lambda_cu)); add_vector_form(new Hermes::Hermes2D::WeakFormsH1::DefaultVectorFormVol<double>(0, Hermes::HERMES_ANY, vol_src_term)); // Residual forms - surface. add_vector_form_surf(new Hermes::Hermes2D::WeakFormsH1::DefaultResidualSurf<double>(0, bdy_heat_flux, new Hermes::Hermes2DFunction<double>(alpha))); add_vector_form_surf(new Hermes::Hermes2D::WeakFormsH1::DefaultVectorFormSurf<double>(0, bdy_heat_flux, new Hermes::Hermes2DFunction<double>(-alpha * t_exterior))); };
CustomWeakForm::CustomWeakForm(double Le, double alpha, double beta, double kappa, double x1, double tau, bool JFNK, bool PRECOND, Hermes::Hermes2D::Filter<double>* omega, Hermes::Hermes2D::Filter<double>* omega_dt, Hermes::Hermes2D::Filter<double>* omega_dc, Solution<double>* t_prev_time_1, Solution<double>* c_prev_time_1, Solution<double>* t_prev_time_2, Solution<double>* c_prev_time_2) : WeakForm<double>(2, JFNK ? true : false), Le(Le), alpha(alpha), beta(beta), kappa(kappa), x1(x1) { if (!JFNK || (JFNK && PRECOND == 1)) { MatrixFormVol<double>* mfv = new JacobianFormVol_0_0(tau); mfv->ext.push_back(omega_dt); add_matrix_form(mfv); MatrixFormSurf<double>* mfs = new JacobianFormSurf_0_0("Neumann", kappa); add_matrix_form_surf(mfs); mfv = new JacobianFormVol_0_1(tau); mfv->ext.push_back(omega_dc); add_matrix_form(mfv); mfv = new JacobianFormVol_1_0(tau); mfv->ext.push_back(omega_dt); add_matrix_form(mfv); mfv = new JacobianFormVol_1_1(tau, Le); mfv->ext.push_back(omega_dc); add_matrix_form(mfv); } else if (PRECOND == 2) { MatrixFormVol<double>* mfv = new PreconditionerForm_0(tau, Le); add_matrix_form(mfv); mfv = new PreconditionerForm_1(tau, Le); add_matrix_form(mfv); } VectorFormVol<double>* vfv = new ResidualFormVol_0(tau); vfv->ext.push_back(t_prev_time_1); vfv->ext.push_back(t_prev_time_2); vfv->ext.push_back(omega); add_vector_form(vfv); VectorFormSurf<double>* vfs = new ResidualFormSurf_0("Neumann", kappa); add_vector_form_surf(vfs); vfv = new ResidualFormVol_1(tau, Le); vfv->ext.push_back(c_prev_time_1); vfv->ext.push_back(c_prev_time_2); vfv->ext.push_back(omega); add_vector_form(vfv); }
void registerForms() { // boundary conditions for (int i = 0; i<Util::scene()->edges.count(); i++) { SceneBoundaryHeat *boundary = dynamic_cast<SceneBoundaryHeat *>(Util::scene()->edges[i]->boundary); if (boundary && Util::scene()->edges[i]->boundary != Util::scene()->boundaries[0]) { if (boundary->type == PhysicFieldBC_Heat_Flux) { // vector flux term double flux = boundary->heatFlux.number + boundary->h.number * boundary->externalTemperature.number; if (fabs(flux) > EPS_ZERO) add_vector_form_surf(new WeakFormsH1::SurfaceVectorForms::DefaultVectorFormSurf(0, QString::number(i + 1).toStdString(), flux, convertProblemType(Util::scene()->problemInfo()->problemType))); if (fabs(boundary->h.number) > EPS_ZERO) add_matrix_form_surf(new WeakFormsH1::SurfaceMatrixForms::DefaultMatrixFormSurf(0, 0, QString::number(i + 1).toStdString(), boundary->h.number, convertProblemType(Util::scene()->problemInfo()->problemType))); } } } // materials for (int i = 0; i<Util::scene()->labels.count(); i++) { SceneMaterialHeat *material = dynamic_cast<SceneMaterialHeat *>(Util::scene()->labels[i]->material); if (material && Util::scene()->labels[i]->material != Util::scene()->materials[0]) { add_matrix_form(new WeakFormsH1::VolumetricMatrixForms::DefaultLinearDiffusion(0, 0, QString::number(i).toStdString(), material->thermal_conductivity.number, HERMES_SYM, convertProblemType(Util::scene()->problemInfo()->problemType))); if (fabs(material->volume_heat.number) > EPS_ZERO) add_vector_form(new WeakFormsH1::VolumetricVectorForms::DefaultVectorFormConst(0, QString::number(i).toStdString(), material->volume_heat.number, convertProblemType(Util::scene()->problemInfo()->problemType))); // transient analysis if (Util::scene()->problemInfo()->analysisType == AnalysisType_Transient) { if ((fabs(material->density.number) > EPS_ZERO) && (fabs(material->specific_heat.number) > EPS_ZERO)) { if (solution.size() > 0) { add_matrix_form(new WeakFormsH1::VolumetricMatrixForms::DefaultLinearMass(0, 0, QString::number(i).toStdString(), material->density.number * material->specific_heat.number / Util::scene()->problemInfo()->timeStep.number, HERMES_SYM, convertProblemType(Util::scene()->problemInfo()->problemType))); add_vector_form(new CustomVectorFormTimeDep(0, QString::number(i).toStdString(), material->density.number * material->specific_heat.number / Util::scene()->problemInfo()->timeStep.number, solution[0], convertProblemType(Util::scene()->problemInfo()->problemType))); } } } } } }