예제 #1
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));
}
예제 #2
0
WeakFormNSNewton::WeakFormNSNewton(bool Stokes, double Reynolds, double time_step, Solution<double>* x_vel_previous_time,
                                   Solution<double>* y_vel_previous_time) : WeakForm<double>(3), Stokes(Stokes),
    Reynolds(Reynolds), time_step(time_step), x_vel_previous_time(x_vel_previous_time),
    y_vel_previous_time(y_vel_previous_time)
{
    BilinearFormSymVel* sym_form_0 = new BilinearFormSymVel(0, 0, Stokes, Reynolds, time_step);
    add_matrix_form(sym_form_0);
    BilinearFormSymVel* sym_form_1 = new BilinearFormSymVel(1, 1, Stokes, Reynolds, time_step);
    add_matrix_form(sym_form_1);

    BilinearFormNonsymVel_0_0* nonsym_vel_form_0_0 = new BilinearFormNonsymVel_0_0(0, 0, Stokes);
    add_matrix_form(nonsym_vel_form_0_0);
    BilinearFormNonsymVel_0_1* nonsym_vel_form_0_1 = new BilinearFormNonsymVel_0_1(0, 1, Stokes);
    add_matrix_form(nonsym_vel_form_0_1);
    BilinearFormNonsymVel_1_0* nonsym_vel_form_1_0 = new BilinearFormNonsymVel_1_0(1, 0, Stokes);
    add_matrix_form(nonsym_vel_form_1_0);
    BilinearFormNonsymVel_1_1* nonsym_vel_form_1_1 = new BilinearFormNonsymVel_1_1(1, 1, Stokes);
    add_matrix_form(nonsym_vel_form_1_1);

    BilinearFormNonsymXVelPressure* nonsym_velx_pressure_form = new BilinearFormNonsymXVelPressure(0, 2);
    add_matrix_form(nonsym_velx_pressure_form);

    BilinearFormNonsymYVelPressure* nonsym_vely_pressure_form = new BilinearFormNonsymYVelPressure(1, 2);
    add_matrix_form(nonsym_vely_pressure_form);

    VectorFormNS_0* F_0 = new VectorFormNS_0(0, Stokes, Reynolds, time_step);
    F_0->ext = Hermes::vector<MeshFunction<double>*>(x_vel_previous_time, y_vel_previous_time);
    add_vector_form(F_0);
    VectorFormNS_1* F_1 = new VectorFormNS_1(1, Stokes, Reynolds, time_step);
    F_1->ext = Hermes::vector<MeshFunction<double>*>(x_vel_previous_time, y_vel_previous_time);
    add_vector_form(F_1);
    VectorFormNS_2* F_2 = new VectorFormNS_2(2);
    add_vector_form(F_2);
}
예제 #3
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);
}
예제 #4
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));
  };
예제 #5
0
  WeakFormNSNewton(bool Stokes, double Reynolds, double time_step, Solution* x_vel_previous_time, 
                   Solution* y_vel_previous_time) : WeakForm(3), Stokes(Stokes), 
                   Reynolds(Reynolds), time_step(time_step), x_vel_previous_time(x_vel_previous_time), 
                   y_vel_previous_time(y_vel_previous_time) {
    // Jacobian
    BilinearFormSymVel* sym_form_0 = new BilinearFormSymVel(0, 0, Stokes, Reynolds, time_step);
    add_matrix_form(sym_form_0);
    BilinearFormSymVel* sym_form_1 = new BilinearFormSymVel(1, 1, Stokes, Reynolds, time_step);
    add_matrix_form(sym_form_1);

    BilinearFormNonsymVel_0_0* nonsym_vel_form_0_0 = new BilinearFormNonsymVel_0_0(0, 0, Stokes);
    add_matrix_form(nonsym_vel_form_0_0);
    BilinearFormNonsymVel_0_1* nonsym_vel_form_0_1 = new BilinearFormNonsymVel_0_1(0, 1, Stokes);
    add_matrix_form(nonsym_vel_form_0_1);
    BilinearFormNonsymVel_1_0* nonsym_vel_form_1_0 = new BilinearFormNonsymVel_1_0(1, 0, Stokes);
    add_matrix_form(nonsym_vel_form_1_0);
    BilinearFormNonsymVel_1_1* nonsym_vel_form_1_1 = new BilinearFormNonsymVel_1_1(1, 1, Stokes);
    add_matrix_form(nonsym_vel_form_1_1);

    BilinearFormNonsymXVelPressure* nonsym_velx_pressure_form = new BilinearFormNonsymXVelPressure(0, 2);
    add_matrix_form(nonsym_velx_pressure_form);

    BilinearFormNonsymYVelPressure* nonsym_vely_pressure_form = new BilinearFormNonsymYVelPressure(1, 2);
    add_matrix_form(nonsym_vely_pressure_form);
    
    // Residual.
    VectorFormNS_0* F_0 = new VectorFormNS_0(0, Stokes, Reynolds, time_step);
    F_0->ext.push_back(x_vel_previous_time);
    add_vector_form(F_0);
    VectorFormNS_1* F_1 = new VectorFormNS_1(1, Stokes, Reynolds, time_step);
    F_1->ext.push_back(y_vel_previous_time);
    add_vector_form(F_1);
    VectorFormNS_2* F_2 = new VectorFormNS_2(2);
    add_vector_form(F_2);
  };
예제 #6
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)));
}
예제 #7
0
  CustomWeakFormPoisson(bool is_matfree = false) : WeakForm(1) {
    this->is_matfree = is_matfree;

    // 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 HermesFunction(4.0)));
  };
예제 #8
0
CustomWeakFormWaveRK::CustomWeakFormWaveRK(double c_squared) : WeakForm<double>(2) 
{
  // Stationary Jacobian.
  add_matrix_form(new MatrixFormVolWave_0_1);
  add_matrix_form(new MatrixFormVolWave_1_0(c_squared));

  // Stationary Residual.
  add_vector_form(new VectorFormVolWave_0());
  add_vector_form(new VectorFormVolWave_1(c_squared));
}
예제 #9
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string area_1, double r, std::string area_2) : WeakForm<double>(1)
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, area_1, new Hermes1DFunction<double>(r)));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, area_2, nullptr));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, area_1, new Hermes1DFunction<double>(r)));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, area_2, nullptr));
}
예제 #10
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)));
}
예제 #11
0
CustomWeakFormWave::CustomWeakFormWave(double tau, double c_squared, Solution<double>* u_prev_sln,
                                       Solution<double>* v_prev_sln) : WeakForm<double>(2) 
{
  // Volumetric matrix forms.
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<double>(0, 1, HERMES_ANY, new Hermes2DFunction<double>(1.0), HERMES_NONSYM));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(1, 0, HERMES_ANY, new Hermes1DFunction<double>(-c_squared), HERMES_NONSYM));

  // Volumetric surface forms.
  add_vector_form(new VectorFormVolWave_0());
  add_vector_form(new VectorFormVolWave_1(c_squared));
}
예제 #12
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string mat_motor, double eps_motor, 
                                             std::string mat_air, double eps_air) : WeakForm(1)
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_motor, new HermesFunction(eps_motor)));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_air, new HermesFunction(eps_air)));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_motor, new HermesFunction(eps_motor)));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_air, new HermesFunction(eps_air)));
}
예제 #13
0
CustomWeakForm::CustomWeakForm(std::string mat_left) : WeakForm<double>(2)
{
  // Jacobian forms.
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormDiffusion<double>(0, 0));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormDiffusion<double>(1, 1));
  add_matrix_form(new CustomFormAdvection(1, 1, mat_left));

  // Residual forms.
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol<double>(0, Hermes::HERMES_ANY, new Hermes2DFunction<double>(100.0)));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol<double>(1, Hermes::HERMES_ANY, new Hermes2DFunction<double>(1.0)));
};
예제 #14
0
CustomWeakForm::CustomWeakForm(double K_squared) : WeakForm(1) 
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol(0, 0, HERMES_ANY, K_squared));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0));
  add_vector_form(new WeakFormsH1::DefaultResidualVol(0, HERMES_ANY, K_squared));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(0, HERMES_ANY, -K_squared));
}
예제 #15
0
CustomWeakFormPoisson::CustomWeakFormPoisson(const std::string& mat_motor, double eps_motor, 
                                             const std::string& mat_air, double eps_air, Mesh* mesh) 
  : WeakForm<double>(1), mat_motor(mat_motor), eps_motor(eps_motor), mat_air(mat_air), eps_air(eps_air), mesh(mesh)
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_motor, new Hermes1DFunction<double>(eps_motor)));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_air, new Hermes1DFunction<double>(eps_air)));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_motor, new Hermes1DFunction<double>(eps_motor)));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_air, new Hermes1DFunction<double>(eps_air)));
}
예제 #16
0
CustomWeakFormPoisson::CustomWeakFormPoisson(
  Hermes::Hermes1DFunction<double>* coeff, Hermes::Hermes2DFunction<double>* f, std::string area,
  GeomType gt) : WeakFormsH1::DefaultWeakFormPoisson<double>()
{
  // Jacobian.
  // NOTE: The flag HERMES_NONSYM is important here.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, area, coeff, HERMES_NONSYM, gt));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, area, coeff, gt));
  add_vector_form(new CustomVectorFormVol(0, f, area, gt));
};
예제 #17
0
CustomWeakForm::CustomWeakForm(CustomFunction* f) : WeakForm(1) 
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol(0, 0, HERMES_ANY, 
                                                        new HermesFunction(f->coeff1*f->coeff1)));
  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0));
  add_vector_form(new WeakFormsH1::DefaultResidualVol(0, HERMES_ANY, 
                                                      new HermesFunction(f->coeff1*f->coeff1)));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(0, HERMES_ANY, f));
}
예제 #18
0
CustomWeakFormPoissonDirichlet::CustomWeakFormPoissonDirichlet(std::string mat_al, double lambda_al,
        std::string mat_cu, double lambda_cu,
        double vol_heat_src) : WeakForm<double>(1)
{
    // Jacobian forms - volumetric.
    add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0, mat_al, new Hermes1DFunction<double>(lambda_al)));
    add_matrix_form(new DefaultJacobianDiffusion<double>(0, 0, mat_cu, new Hermes1DFunction<double>(lambda_cu)));

    // Residual forms - volumetric.
    add_vector_form(new DefaultResidualDiffusion<double>(0, mat_al, new Hermes1DFunction<double>(lambda_al)));
    add_vector_form(new DefaultResidualDiffusion<double>(0, mat_cu, new Hermes1DFunction<double>(lambda_cu)));
    add_vector_form(new DefaultVectorFormVol<double>(0, HERMES_ANY, new Hermes2DFunction<double>(-vol_heat_src)));
};
예제 #19
0
CustomWeakFormPoisson::CustomWeakFormPoisson(const std::string& mat_motor, double eps_motor, 
                                             const std::string& mat_air, double eps_air, bool is_matfree) : WeakForm<double>(1)
{
  this->is_matfree = is_matfree;

  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_motor, new Hermes1DFunction<double>(eps_motor)));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, mat_air, new Hermes1DFunction<double>(eps_air)));

  // Residual.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_motor, new Hermes1DFunction<double>(eps_motor)));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion<double>(0, mat_air, new Hermes1DFunction<double>(eps_air)));
}
예제 #20
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string mat_al, HermesFunction* lambda_al,
                                             std::string mat_cu, HermesFunction* lambda_cu,
                                             HermesFunction* src_term) : WeakForm(1)
{
  // Jacobian forms.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_al, lambda_al));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_cu, lambda_cu));

  // Residual forms.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_al, lambda_al));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_cu, lambda_cu));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(0, HERMES_ANY, src_term));
};
예제 #21
0
CustomWeakFormPoisson::CustomWeakFormPoisson(std::string mat_al, double lambda_al,
                                             std::string mat_cu, double lambda_cu,
                                             double vol_heat_src) : WeakForm(1)
{
  // Jacobian forms - volumetric.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_al, new HermesFunction(lambda_al)));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion(0, 0, mat_cu, new HermesFunction(lambda_cu)));

  // Residual forms - volumetric.
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_al, new HermesFunction(lambda_al)));
  add_vector_form(new WeakFormsH1::DefaultResidualDiffusion(0, mat_cu, new HermesFunction(lambda_cu)));
  add_vector_form(new WeakFormsH1::DefaultVectorFormVol(0, HERMES_ANY, new HermesFunction(-vol_heat_src)));
};
예제 #22
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)));
}
예제 #23
0
CustomWeakForm::CustomWeakForm(CustomRightHandSide1* g1, CustomRightHandSide2* g2) : WeakForm<double>(2) 
{
  // Jacobian.
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(0, 0, HERMES_ANY, new Hermes1DFunction<double>(g1->d_u * g1->d_u)));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<double>(0, 0, HERMES_ANY, new Hermes2DFunction<double>(-1.0)));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<double>(0, 1, HERMES_ANY, new Hermes2DFunction<double>(g1->sigma), HERMES_NONSYM));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<double>(1, 0, HERMES_ANY, new Hermes2DFunction<double>(-1.0), HERMES_NONSYM));
  add_matrix_form(new WeakFormsH1::DefaultJacobianDiffusion<double>(1, 1, HERMES_ANY, new Hermes1DFunction<double>(g2->d_v * g2->d_v)));
  add_matrix_form(new WeakFormsH1::DefaultMatrixFormVol<double>(1, 1, HERMES_ANY, new Hermes2DFunction<double>(1.0)));

  // Residual.
  add_vector_form(new CustomResidual1(g1->d_u, g1->sigma, g1));
  add_vector_form(new CustomResidual2(g2->d_v, g2));
}
예제 #24
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)));
  };
예제 #25
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());
  };
예제 #26
0
CustomWeakFormContinuousGalerkin::CustomWeakFormContinuousGalerkin(GalerkinMethod method, double epsilon)
  : WeakForm(1), fn_epsilon(new HermesFunction(epsilon)), 
    fn_b1(new HermesFunction(ConstFlowField::b1)), fn_b2(new HermesFunction(ConstFlowField::b2))
{ 
  add_matrix_form(new WeakFormsH1::DefaultJacobianAdvection(0, 0, HERMES_ANY, fn_b1, fn_b2));
  add_vector_form(new WeakFormsH1::DefaultResidualAdvection(0, HERMES_ANY, fn_b1, fn_b2));
  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));
  
  if (method != CG) 
  {
    add_matrix_form(new StabilizationJacobian(method, epsilon));
    add_vector_form(new StabilizationResidual(method, epsilon));
  }
}
예제 #27
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));
}
예제 #28
0
CustomWeakForm::CustomWeakForm(CustomRightHandSide* rhs) : WeakForm(1) 
{
  // Jacobian.
  add_matrix_form(new CustomMatrixFormVol(0, 0, rhs->epsilon));
  // Residual.
  add_vector_form(new CustomVectorFormVol(0, rhs));
}
예제 #29
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));
}
예제 #30
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));
}