Exemplo n.º 1
0
CustomWeakForm::CustomWeakForm(CustomRightHandSide* rhs, std::string bdy_left_right, double K) : WeakForm(1) 
{
  add_matrix_form(new CustomMatrixFormVol(0, 0));
  add_vector_form(new CustomVectorFormVol(0, rhs));
  add_vector_form_surf(new CustomVectorFormSurfRight(0, K, bdy_left_right));
  add_vector_form_surf(new CustomVectorFormSurfLeft(0, K, bdy_left_right));
}
Exemplo n.º 2
0
CustomWeakFormHeatMoistureRK::CustomWeakFormHeatMoistureRK(double c_TT, double c_ww, double d_TT, double d_Tw, double d_wT,
  double d_ww, double k_TT, double k_ww, double T_ext, double w_ext, const std::string bdy_ext) : WeakForm<double>(2)
{
  // Jacobian - volumetric.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, HERMES_ANY, new Hermes1DFunction<double>(-d_TT / c_TT), HERMES_SYM, HERMES_AXISYM_Y));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 1, HERMES_ANY, new Hermes1DFunction<double>(-d_Tw / c_TT), HERMES_NONSYM, HERMES_AXISYM_Y));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(1, 0, HERMES_ANY, new Hermes1DFunction<double>(-d_wT / c_ww), HERMES_NONSYM, HERMES_AXISYM_Y));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(1, 1, HERMES_ANY, new Hermes1DFunction<double>(-d_ww / c_ww), HERMES_SYM, HERMES_AXISYM_Y));

  // Jacobian - surface.
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<double>(0, 0, bdy_ext, new Hermes2DFunction<double>(-k_TT / c_TT), HERMES_AXISYM_Y));
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<double>(1, 1, bdy_ext, new Hermes2DFunction<double>(-k_ww / c_ww), HERMES_AXISYM_Y));

  // Residual - volumetric
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, HERMES_ANY, new Hermes1DFunction<double>(-d_TT / c_TT), HERMES_AXISYM_Y));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, HERMES_ANY, new Hermes1DFunction<double>(-d_Tw / c_TT), HERMES_AXISYM_Y));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(1, HERMES_ANY, new Hermes1DFunction<double>(-d_wT / c_ww), HERMES_AXISYM_Y));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(1, HERMES_ANY, new Hermes1DFunction<double>(-d_ww / c_ww), HERMES_AXISYM_Y));

  // Residual - surface.
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf<double>(0, bdy_ext, new Hermes2DFunction<double>(k_TT / c_TT * T_ext), HERMES_AXISYM_Y));
  add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf<double>(0, bdy_ext, new Hermes2DFunction<double>(-k_TT / c_TT), HERMES_AXISYM_Y));
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf<double>(1, bdy_ext, new Hermes2DFunction<double>(k_ww / c_ww * w_ext), HERMES_AXISYM_Y));
  add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf<double>(1, bdy_ext, new Hermes2DFunction<double>(-k_ww / c_ww), HERMES_AXISYM_Y));
}
Exemplo n.º 3
0
  CustomWeakFormHeatRK1(std::string bdy_air, double alpha, double lambda, double heatcap, double rho,
                        double time_step, double* current_time_ptr, double temp_init, double t_final,
                        Solution* prev_time_sln) : WeakForm(1)
  {
    /* Jacobian */
    // Contribution of the time derivative term.
    add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol(0, 0, HERMES_ANY, new HermesFunction(1.0 / time_step)));
    // Contribution of the diffusion term.
    add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, HERMES_ANY, new HermesFunction(lambda / (rho * heatcap))));
    // Contribution of the Newton boundary condition.
    add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf(0, 0, bdy_air, new HermesFunction(alpha / (rho * heatcap))));

    // Residual.
    // Contribution of the time derivative term.
    add_vector_form(new WeakFormsH1::DefaultResidualVol(0, HERMES_ANY, new HermesFunction(1.0 / time_step)));
    // Contribution of the diffusion term.
    add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, HERMES_ANY, new HermesFunction(lambda / (rho * heatcap))));
    CustomVectorFormVol* vec_form_vol = new CustomVectorFormVol(0, time_step);
    vec_form_vol->ext.push_back(prev_time_sln);
    add_vector_form(vec_form_vol);
    // Contribution of the Newton boundary condition.
    add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf(0, bdy_air, new HermesFunction(alpha / (rho * heatcap))));
    // Contribution of the Newton boundary condition.
    add_vector_form_surf(new CustomVectorFormSurf(0, bdy_air, alpha, rho, heatcap,
                         current_time_ptr, temp_init, t_final));
  };
Exemplo n.º 4
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string omega_1, std::string omega_2, 
                                             std::string omega_3, std::string omega_4, 
                                             std::string omega_5, std::string bdy_left, 
                                             std::string bdy_top, std::string bdy_right, 
                                             std::string bdy_bottom, MeshSharedPtr mesh) : WeakForm<double>(1),
  
  omega_1(omega_1), omega_2(omega_2), omega_3(omega_3), 
  omega_4(omega_4), omega_5(omega_5), mesh(mesh),

  p_1(25.0),
  p_2(7.0),
  p_3(5.0),
  p_4(0.2),
  p_5(0.05),

  q_1(25.0),
  q_2(0.8),
  q_3(0.0001),
  q_4(0.2),
  q_5(0.05),

  f_1(0.0),
  f_2(1.0),
  f_3(1.0),
  f_4(0.0),
  f_5(0.0),

  bdy_left(bdy_left), 
  bdy_top(bdy_top), 
  bdy_right(bdy_right), 
  bdy_bottom(bdy_bottom),

  c_left(0.0),
  c_top(1.0),
  c_right(2.0),
  c_bottom(3.0),

  g_n_left(0.0),
  g_n_top(3.0),
  g_n_right(2.0),
  g_n_bottom(1.0)

{
    add_matrix_form(new CustomMatrixFormVol(0, 0, mesh));
    add_vector_form(new CustomVectorFormVol(0, mesh));

    add_matrix_form_surf(new CustomMatrixFormSurf(0, 0, bdy_bottom));
    add_matrix_form_surf(new CustomMatrixFormSurf(0, 0, bdy_right));
    add_matrix_form_surf(new CustomMatrixFormSurf(0, 0, bdy_top));

    add_vector_form_surf(new CustomVectorFormSurf(0, bdy_bottom));
    add_vector_form_surf(new CustomVectorFormSurf(0, bdy_top));
    add_vector_form_surf(new CustomVectorFormSurf(0, bdy_left));
    add_vector_form_surf(new CustomVectorFormSurf(0, bdy_right));

}
Exemplo n.º 5
0
CustomWeakFormLinearElasticity::CustomWeakFormLinearElasticity(double E, double nu, double rho_g,
                                 std::string surface_force_bdy, double f0, double f1) : WeakForm(2)
{
  double lambda = (E * nu) / ((1 + nu) * (1 - 2*nu));
  double mu = E / (2*(1 + nu));
       
#ifdef USE_MULTICOMPONENT_FORMS
  // Jacobian matrix.
  // There is one multi-component and one single-component form since we want to exploit symmetry of the forms.
  add_multicomponent_matrix_form(new WeakFormsElasticity::DefaultJacobianElasticity_00_11(
        Hermes::vector<std::pair<unsigned int, unsigned int> >(make_pair(0, 0), make_pair(1, 1)), 
        HERMES_ANY, lambda, mu));
  add_matrix_form(new WeakFormsElasticity::DefaultJacobianElasticity_0_1(0, 1, lambda, mu));

  // Residual.
  add_multicomponent_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_00_11(
				  Hermes::vector<unsigned int>(0, 1), lambda, mu));
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_0_1(0, lambda, mu));
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_1_0(1, lambda, mu));

  // Gravity loading.
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(1, HERMES_ANY, new HermesFunction(-rho_g)));

  // External forces.
  add_multicomponent_vector_form_surf(new WeakFormsH1::DefaultMultiComponentVectorFormSurf(
                                      Hermes::vector<unsigned int>(0, 1), surface_force_bdy, 
                                      Hermes::vector<double>(f0, f1)));
#else 
  // SINGLE-COMPONENT FORMS. USEFUL FOR MULTIMESH, DO NOT REMOVE.
  // Jacobian.
  add_matrix_form(new WeakFormsElasticity::DefaultJacobianElasticity_0_0(0, 0, lambda, mu));
  add_matrix_form(new WeakFormsElasticity::DefaultJacobianElasticity_0_1(0, 1, lambda, mu));
  add_matrix_form(new WeakFormsElasticity::DefaultJacobianElasticity_1_1(1, 1, lambda, mu));

  // Residual - first equation.
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_0_0(0, HERMES_ANY, lambda, mu));
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_0_1(0, HERMES_ANY, lambda, mu));
  // Surface force (first component).
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf(0, surface_force_bdy, new HermesFunction(f0))); 

  // Residual - second equation.
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_1_0(1, HERMES_ANY, lambda, mu));
  add_vector_form(new WeakFormsElasticity::DefaultResidualElasticity_1_1(1, HERMES_ANY, lambda, mu));
  // Gravity loading in the second vector component.
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(1, HERMES_ANY, new HermesFunction(rho_g)));
  // Surface force (second component).
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf(1, surface_force_bdy, new HermesFunction(f1))); 
#endif
}
Exemplo n.º 6
0
  CustomWeakForm(double mu_r, double kappa) : WeakForm(1)
  {
    std::complex<double> ii = std::complex<double>(0.0, 1.0);

    // Jacobian.
    add_matrix_form(new WeakFormsHcurl::DefaultJacobianCurlCurl<std::complex<double> >(0, 0, HERMES_ANY, 1.0/mu_r));
    add_matrix_form(new WeakFormsHcurl::DefaultMatrixFormVol<std::complex<double> >(0, 0, HERMES_ANY, -sqr(kappa)));
    add_matrix_form_surf(new WeakFormsHcurl::DefaultMatrixFormSurf<std::complex<double> >(0, 0, HERMES_ANY, -kappa*ii));

    // Residual.
    add_vector_form(new WeakFormsHcurl::DefaultResidualCurlCurl<std::complex<double> >(0, HERMES_ANY, 1.0/mu_r));
    add_vector_form(new WeakFormsHcurl::DefaultResidualVol<std::complex<double> >(0, HERMES_ANY, -sqr(kappa)));
    add_vector_form_surf(new WeakFormsHcurl::DefaultResidualSurf<std::complex<double> >(0, HERMES_ANY, -kappa*ii));
    add_vector_form_surf(new CustomVectorFormSurf());
  };
Exemplo n.º 7
0
CustomWeakForm::CustomWeakForm(double Le, double alpha, double beta, double kappa, double x1, double tau, bool JFNK, int PRECOND, 
  Hermes::Hermes2D::MeshFunctionSharedPtr<double>  omega, Hermes::Hermes2D::MeshFunctionSharedPtr<double>  omega_dt, Hermes::Hermes2D::MeshFunctionSharedPtr<double>  omega_dc,
  MeshFunctionSharedPtr<double>  t_prev_time_1, MeshFunctionSharedPtr<double>  c_prev_time_1, MeshFunctionSharedPtr<double>  t_prev_time_2, MeshFunctionSharedPtr<double>  c_prev_time_2) : WeakForm<double>(2, JFNK ? true : false), Le(Le), alpha(alpha), beta(beta), kappa(kappa), x1(x1)
{
  this->set_ext(Hermes::vector<MeshFunctionSharedPtr<double> >(omega_dt, omega_dc, t_prev_time_1, t_prev_time_2, c_prev_time_1, c_prev_time_2, omega));

  if (!JFNK || (JFNK && PRECOND == 1))
  {
    MatrixFormVol<double>* mfv = new JacobianFormVol_0_0(tau);
    add_matrix_form(mfv);
    MatrixFormSurf<double>* mfs = new JacobianFormSurf_0_0("Outer", kappa);
    add_matrix_form_surf(mfs);
    mfv = new JacobianFormVol_0_1(tau);
    add_matrix_form(mfv);
    mfv = new JacobianFormVol_1_0(tau);
    add_matrix_form(mfv);
    mfv = new JacobianFormVol_1_1(tau, Le);
    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);
  add_vector_form(vfv);
  VectorFormSurf<double>* vfs = new ResidualFormSurf_0("Outer", kappa);
  add_vector_form_surf(vfs);
  vfv = new ResidualFormVol_1(tau, Le);
  add_vector_form(vfv);
}
Exemplo n.º 8
0
CustomWeakForm::CustomWeakForm(std::string left_bottom_bnd_part) : WeakForm(1) 
{
    add_matrix_form(new MatrixFormVol(0, 0));
    add_vector_form(new VectorFormVol(0));
    add_matrix_form_surf(new MatrixFormSurface(0, 0));
    add_matrix_form_surf(new MatrixFormInterface(0, 0));
    add_vector_form_surf(new VectorFormSurface(0, left_bottom_bnd_part));
}
Exemplo n.º 9
0
CustomWeakFormDiscontinuousGalerkin::CustomWeakFormDiscontinuousGalerkin(const EssentialBCs& boundary_values,
                                                                        double epsilon, int theta, int C_W)
  : WeakForm(1), theta(theta), C_W(C_W), fn_epsilon(new HermesFunction(epsilon))
{
  add_matrix_form(new Advection::VolumetricJacobian);
  add_vector_form(new Advection::VolumetricResidual);
  add_matrix_form_surf(new Advection::BoundaryJacobian);
  add_vector_form_surf(new Advection::BoundaryResidual(boundary_values));
  add_matrix_form_surf(new Advection::InterfaceJacobian);
  add_vector_form_surf(new Advection::InterfaceResidual);
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0,0,HERMES_ANY,fn_epsilon,HERMES_SYM));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0,HERMES_ANY,fn_epsilon));
  add_matrix_form_surf(new Diffusion::BoundaryJacobian(epsilon, theta, C_W));
  add_vector_form_surf(new Diffusion::BoundaryResidual(boundary_values, epsilon, theta, C_W));
  add_matrix_form_surf(new Diffusion::InterfaceJacobian(epsilon, theta, C_W));
  add_vector_form_surf(new Diffusion::InterfaceResidual(epsilon, theta, C_W));
}
Exemplo n.º 10
0
CustomWeakForm::CustomWeakForm(std::string left_bottom_bnd_part, Mesh* mesh) : WeakForm<double>(1), mesh(mesh)
{
    add_matrix_form(new CustomMatrixFormVol(0, 0));
    add_vector_form(new CustomVectorFormVol(0));
    add_matrix_form_surf(new CustomMatrixFormSurface(0, 0));
    add_matrix_form_DG(new CustomMatrixFormInterface(0, 0));
    add_vector_form_surf(new CustomVectorFormSurface(0, left_bottom_bnd_part));
}
Exemplo n.º 11
0
WeakFormHelmholtz::WeakFormHelmholtz(double eps, double mu, double omega, double sigma, double beta, 
    double E0, double h) : WeakForm<double>(2)
{
  // Jacobian.
  add_matrix_form(new MatrixFormHelmholtzEquation_real_real(0, 0, eps, omega, mu));
  add_matrix_form(new MatrixFormHelmholtzEquation_real_imag(0, 1, mu, omega, sigma));
  add_matrix_form(new MatrixFormHelmholtzEquation_imag_real(1, 0, mu, omega, sigma));
  add_matrix_form(new MatrixFormHelmholtzEquation_imag_imag(1, 1, eps, mu, omega));
  add_matrix_form_surf(new  MatrixFormSurfHelmholtz_real_imag(0, 1, "Bdy_impedance", beta));
  add_matrix_form_surf(new  MatrixFormSurfHelmholtz_imag_real(1, 0, "Bdy_impedance", beta));

  // Residual.
  add_vector_form(new VectorFormHelmholtzEquation_real(0, eps, omega, mu, sigma));
  add_vector_form(new VectorFormHelmholtzEquation_imag(1, eps, omega, mu, sigma));
  add_vector_form_surf(new VectorFormSurfHelmholtz_real(0, "Bdy_impedance", beta));
  add_vector_form_surf(new VectorFormSurfHelmholtz_imag(1, "Bdy_impedance", beta));  
}
Exemplo n.º 12
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string bdy_marker_right) : WeakForm(1) 
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0));
   // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(0, HERMES_ANY, new CustomFunction));
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf(0, bdy_marker_right, new HermesFunction(1.0)));
}
Exemplo n.º 13
0
CustomWeakForm::CustomWeakForm(std::string marker_bdy_right) : WeakForm<double>(1) 
{
  // Jacobian.
  add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0));
  add_matrix_form(new CustomJacobian(0, 0));

  // Residual.
  add_vector_form(new DefaultResidualDiffusion<double>(0));
  add_vector_form(new CustomResidual(0));
  add_vector_form_surf(new DefaultVectorFormSurf<double>(0, marker_bdy_right, new Hermes::Hermes2DFunction<double>(1.0)));
}
Exemplo n.º 14
0
CustomWeakFormGeneral::CustomWeakFormGeneral(std::string bdy_vertical) : WeakForm<double>(1)
{
  // Jacobian forms - volumetric.
  add_matrix_form(new MatrixFormVolGeneral(0, 0));

  // Residual forms - volumetric.
  add_vector_form(new VectorFormVolGeneral(0));

  // Residual forms - surface.
  add_vector_form_surf(new VectorFormSurfGeneral(0, bdy_vertical));
}
Exemplo n.º 15
0
CustomWeakForm::CustomWeakForm( const MaterialPropertyMaps& matprop,
                                Hermes::vector<Solution*>& iterates,
                                double init_keff, std::string bdy_vacuum )
  : DefaultWeakFormSourceIteration(matprop, iterates, init_keff, HERMES_AXISYM_Y)
{
  for (unsigned int g = 0; g < matprop.get_G(); g++)
  {
    add_matrix_form_surf(new VacuumBoundaryCondition::Jacobian(g, bdy_vacuum, HERMES_AXISYM_Y));
    add_vector_form_surf(new VacuumBoundaryCondition::Residual(g, bdy_vacuum, HERMES_AXISYM_Y));
  }
}
Exemplo n.º 16
0
CustomWeakForm::CustomWeakForm(double e_0, double mu_0, double mu_r, double kappa, double omega,
  double J, bool align_mesh, MeshSharedPtr mesh, std::string current_bdy) : WeakForm<::complex>(1), marker(mesh->get_element_markers_conversion().get_internal_marker("e1").marker)
{
  // Jacobian forms - volumetric.
  add_matrix_form(new CustomMatrixForm(0, 0, e_0, mu_0, mu_r, kappa, omega, J, align_mesh));

  // Residual forms - volumetric.
  add_vector_form(new CustomResidualForm(0, e_0, mu_0, mu_r, kappa, omega, J, align_mesh));

  // Residual forms - surface.
  add_vector_form_surf(new CustomVectorFormSurf(omega, J, current_bdy));
}
Exemplo n.º 17
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)));
};
Exemplo n.º 18
0
  CustomWeakFormAcoustics(std::string bdy_newton, double rho, double sound_speed, double omega) : WeakForm(1) 
  {
    scalar ii =  cplx(0.0, 1.0);

    // Jacobian.
    add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, HERMES_ANY, new HermesFunction(1.0/rho), HERMES_SYM));
    add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol(0, 0, HERMES_ANY, new HermesFunction(-sqr(omega) / rho / sqr(sound_speed)), HERMES_SYM));
    add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf(0, 0, bdy_newton, new HermesFunction(-ii * omega / rho / sound_speed)));

    // Residual.
    add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, HERMES_ANY, new HermesFunction(1.0/rho)));
    add_vector_form(new WeakFormsH1::DefaultResidualVol(0, HERMES_ANY, new HermesFunction(-sqr(omega) / rho / sqr(sound_speed))));
    add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf(0, bdy_newton, new HermesFunction(-ii * omega / rho / sound_speed)));
  };
Exemplo n.º 19
0
CustomWeakFormHeatRK::CustomWeakFormHeatRK(std::string bdy_fire, std::string bdy_air,
                                           double alpha_fire, double alpha_air, double rho, double heatcap,
                                           double temp_ext_air, double temp_init, double* current_time_ptr) : WeakForm<double>(1)
{
  // Jacobian - volumetric part.
  add_matrix_form(new CustomJacobianVol(0, 0, rho, heatcap));

  // Jacobian - surface part.
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<double>(0, 0, bdy_fire, new Hermes2DFunction<double>(-alpha_fire/(rho*heatcap))));
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<double>(0, 0, bdy_air, new Hermes2DFunction<double>(-alpha_air/(rho*heatcap))));

  // Residual - volumetric part.
  add_vector_form(new CustomFormResidualVol(0, rho, heatcap));

  // Surface residual - bottom boundary.
  CustomFormResidualSurfFire* vec_form_surf_1
    = new CustomFormResidualSurfFire(0, bdy_fire, alpha_fire, rho, heatcap, current_time_ptr);
  add_vector_form_surf(vec_form_surf_1);

  // Surface residual - top boundary.
  add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf<double>(0, HERMES_ANY, new Hermes2DFunction<double>(-alpha_air / (rho*heatcap))));
  add_vector_form_surf(new WeakFormsH1::DefaultVectorFormSurf<double>(0, HERMES_ANY, new Hermes2DFunction<double>(alpha_air* temp_ext_air / (rho*heatcap))));
}
Exemplo n.º 20
0
CustomWeakFormAcoustics::CustomWeakFormAcoustics(std::string bdy_newton, double rho, double sound_speed, double omega) : WeakForm<::complex>(1)
{
  std::complex<double>  ii = std::complex<double>(0.0, 1.0);

  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<::complex>(0, 0, HERMES_ANY, new Hermes1DFunction<::complex>(1.0 / rho), HERMES_SYM));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<::complex>(0, 0, HERMES_ANY, new Hermes2DFunction<::complex>(-sqr(omega) / rho / sqr(sound_speed)), HERMES_SYM));
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<::complex>(0, 0, bdy_newton, new Hermes2DFunction<::complex>(-ii * omega / rho / sound_speed)));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<::complex>(0, HERMES_ANY, new Hermes1DFunction<::complex>(1.0 / rho)));
  add_vector_form(new WeakFormsH1::DefaultResidualVol<::complex>(0, HERMES_ANY, new Hermes2DFunction<::complex>(-sqr(omega) / rho / sqr(sound_speed))));
  add_vector_form_surf(new WeakFormsH1::DefaultResidualSurf<::complex>(0, bdy_newton, new Hermes2DFunction<::complex>(-ii * omega / rho / sound_speed)));
}
Exemplo n.º 21
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) : Hermes::Hermes2D::WeakForm<double>(1)
{
  // Jacobian volumetric part.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, HERMES_ANY, new Hermes1DFunction<double>(-lambda / (heatcap * rho))));

  // Jacobian surface part.
  add_matrix_form_surf(new WeakFormsH1::DefaultMatrixFormSurf<double>(0, 0, bdy_air, new Hermes2DFunction<double>(-alpha / (heatcap * rho))));

  // Residual - volumetric.
  add_vector_form(new WeakFormsH1::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));
}
Exemplo n.º 22
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));
}
Exemplo n.º 23
0
CustomWeakFormPoissonNeumann::CustomWeakFormPoissonNeumann(std::string mat_al, Hermes1DFunction<double>* lambda_al,
                                                           std::string mat_cu, Hermes1DFunction<double>* lambda_cu,
                                                           Hermes2DFunction<double>* vol_src_term, std::string bdy_heat_flux,
                                                           Hermes2DFunction<double>* surf_src_term) : WeakForm<double>(1)
{
  // Jacobian forms - volumetric.
  add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0, mat_al, lambda_al));
  add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0, mat_cu, lambda_cu));

  // Residual forms - volumetric.
  add_vector_form(new DefaultResidualDiffusion<double>(0, mat_al, lambda_al));
  add_vector_form(new DefaultResidualDiffusion<double>(0, mat_cu, lambda_cu));
  add_vector_form(new DefaultVectorFormVol<double>(0, HERMES_ANY, vol_src_term));

  // Residual forms - surface.
  add_vector_form_surf(new DefaultVectorFormSurf<double>(0, bdy_heat_flux, surf_src_term));
};
Exemplo n.º 24
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);
}
Exemplo n.º 25
0
 CustomWeakForm(double e_0, double mu_0, double mu_r, double kappa, double omega, 
                double J, bool align_mesh) : WeakForm(1) {
   add_matrix_form(new CustomMatrixForm(0, 0, e_0, mu_0, mu_r, kappa, align_mesh));
   add_vector_form_surf(new CustomVectorFormSurf(omega, J));
 };
Exemplo n.º 26
0
 CustomWeakFormGeneral() : WeakForm(1)
 {
   add_matrix_form(new MatrixFormVolGeneral(0, 0));
   add_vector_form(new VectorFormVolGeneral(0));
   add_vector_form_surf(new VectorFormSurfGeneral(0, BDY_VERTICAL));
 }
Exemplo n.º 27
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)));
                        }
                    }
                }
            }
        }
    }