Ejemplo n.º 1
0
  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());
  };
Ejemplo n.º 2
0
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));
}
Ejemplo n.º 3
0
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));
}
Ejemplo n.º 4
0
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)));
};
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
    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)));
                        }
                    }
                }
            }
        }
    }