[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Getfem-users] bilaplacian
From: |
Jano |
Subject: |
Re: [Getfem-users] bilaplacian |
Date: |
Sun, 5 Sep 2010 23:32:05 -0300 |
Hi Yves,
Yes I did try IM_GAUSS1D(5) with no success.
When I use " add_normal_derivative_Dirichlet_condition_with_multipliers
" I get " sub matrix too large ",
I made some test with the bilaplacian.cc example, the 1d case seams to
have some problem I'm not sure but looks like a bug.
The 2d case looks ok, but I'm not sure about the analytical solution.
(The test I made was: bilaplacian(u) = const, u=0 and u'=0 in the borders)
any ideas?
Jano
On Sun, Sep 5, 2010 at 3:38 PM, Renard Yves <address@hidden> wrote:
>
>
> Dear Jano,
>
> IM_GAUSS1D(3) represent a (small) sub-integration. Did you try with
> IM_GAUSS1D(5) ?
>
>
> Yves.
>
>
>
>
> Jano <address@hidden> a écrit :
>
>> Hi,
>>
>> I just started using the getfem++ lib, made some tests but I'm getting
>> some weird results.
>> I wanted to test the equation:
>> d4u/dx4 = f
>> u = variable
>> f = constant = 2
>> b.c.
>>
>> u(0) = u(1) = 0
>> du(0) = du(1) = 0
>>
>> using FEM_HERMITE(1), simplex_geotrans(1,1) and IM_GAUSS1D(3),
>>
>> for what I know it is a well conditioned problem and should give the
>> exact solution.
>> It compiles, run, but give a huge condition number and nothing even
>> near the exact solution.
>>
>> thanks if anyone can help,
>> Jano
>>
>> ps: sorry if the email is duplicated
>>
>>
>> Here is my code if someone can find what i did wrong:
>>
>> #include <stdlib.h>
>> #include <string>
>> #include <getfem/getfem_mesh.h>
>> #include <getfem/getfem_mesh_fem.h>
>> #include <getfem/getfem_import.h>
>> #include <getfem/getfem_regular_meshes.h>
>> #include <getfem/getfem_mesh_im.h>
>> #include <getfem/getfem_models.h>
>> #include <gmm/gmm.h>
>> #include <getfem/getfem_export.h>
>> #include <getfem/getfem_model_solvers.h>
>> #include <getfem/getfem_fourth_order.h>
>>
>> bgeot::scalar_type condicaoDirichlet(const bgeot::base_node &x) {
>> return 0.0;
>> }
>>
>> bgeot::scalar_type DcondicaoDirichlet(const bgeot::base_node &x) {
>> return 0.0;
>> }
>>
>> bgeot::scalar_type D = 1.0;
>> bgeot::scalar_type f = -2.0;
>>
>>
>> /*
>> *
>> */
>> int main(int argc, char** argv) {
>>
>> //FEM_HERMITE(n)-Elemento de Hermite com n dimensões.
>> std::string femName = "FEM_HERMITE(1)";
>> //Flag para a regiao de contorno
>> int DIRICHLET_BOUNDARY_NUM = 0;
>> //Malha
>> getfem::mesh malha;
>> //getfem::import_mesh(string FILENAME, string FORMAT, mesh m)
>> //Geracao e refinamento da malha
>> std::vector<getfem::size_type> nsubdiv(1);
>> nsubdiv[0] = 50;
>> //nsubdiv[1] = 100;
>> getfem::regular_unit_mesh(malha, nsubdiv,
>> bgeot::simplex_geotrans(1,1));
>> //mesh_fem representando U e f
>> getfem::mesh_fem meshFem(malha);
>> getfem::mesh_fem meshFemRightHandSide(malha);
>> //Define o tipo de elemento finito
>> meshFem.set_finite_element(getfem::fem_descriptor(femName));
>>
>> meshFemRightHandSide.set_finite_element(getfem::fem_descriptor(femName));
>> //IM_NC(n,k)-Integracao numerica com Newton-Cotes
>> getfem::mesh_im meshIm(malha);
>>
>>
>> meshIm.set_integration_method(getfem::int_method_descriptor("IM_GAUSS1D(3)"));
>> //Instanciacao do modelo
>> getfem::model modelo;
>> //Atribui U e o metodo de integracao
>> modelo.add_fem_variable("u", meshFem);
>> //getfem::add_Laplacian_brick(modelo, meshIm, "u");
>> modelo.add_initialized_scalar_data("D", D);
>> getfem::add_bilaplacian_brick(modelo, meshIm, "u", "D");
>> modelo.add_initialized_scalar_data("f", f);
>> getfem::add_source_term_brick(modelo, meshIm, "u", "f");
>> //Define a regiao de contorno com a flag DIRICHLET_BOUNDARY_NUM
>> getfem::mesh_region border_faces;
>> getfem::outer_faces_of_mesh(malha, border_faces);
>> for (getfem::mr_visitor i(border_faces); !i.finished(); ++i) {
>> malha.region(DIRICHLET_BOUNDARY_NUM).add(i.cv(), i.f());
>> }
>> //Condicoes de contorno de Dirichlet
>> std::vector<bgeot::scalar_type> F(meshFemRightHandSide.nb_dof());
>> std::vector<bgeot::scalar_type> F2(meshFemRightHandSide.nb_dof());
>> getfem::interpolation_function(meshFemRightHandSide, F,
>> condicaoDirichlet);
>> getfem::interpolation_function(meshFemRightHandSide, F2,
>> DcondicaoDirichlet);
>> modelo.add_initialized_fem_data("DirichletData",
>> meshFemRightHandSide, F);
>> modelo.add_initialized_fem_data("derivadaDirichletData",
>> meshFemRightHandSide, F2);
>> getfem::add_Dirichlet_condition_with_multipliers(
>> modelo, meshIm, "u", meshFem, DIRICHLET_BOUNDARY_NUM,
>> "DirichletData");
>> getfem::add_normal_derivative_Dirichlet_condition_with_multipliers(
>> modelo, meshIm, "u", meshFem, DIRICHLET_BOUNDARY_NUM,
>> "derivadaDirichletData");
>>
>>
>> //Define o residuo maximo e um iterator
>> bgeot::scalar_type maxResidualIterativeSolver = pow(10, -5);
>> gmm::iteration iter(maxResidualIterativeSolver, 1, 40000);
>> //Solver
>> getfem::standard_solve(modelo, iter);
>> //Guarda a solucao em u
>> std::vector<bgeot::scalar_type> u = modelo.real_variable("u");
>>
>> std::fstream solucao("solucao.txt",std::ios::out);
>> for (unsigned i=0; i < gmm::vect_size(u); ++(++i))
>> solucao << u[i] << "\t" << u[i+1] << "\n";
>>
>> // when the 2nd arg is true, the mesh is saved with the |mf|
>> meshFem.write_to_file("solucao.mf", true);
>>
>>
>> //Exporta
>> getfem::dx_export exp_dx("solucao.dx");
>> exp_dx.exporting(malha);
>> exp_dx.write_point_data(meshFem, u, "deslocamento");
>>
>> getfem::vtk_export exp_vtk("solucao.vtk");
>> exp_vtk.exporting(malha);
>> exp_vtk.write_point_data(meshFem, u, "deslocamento");
>>
>> return (EXIT_SUCCESS);
>> }
>>
>> _______________________________________________
>> Getfem-users mailing list
>> address@hidden
>> https://mail.gna.org/listinfo/getfem-users
>>
>
>
>
>