Dear Getfem-users,

due to a change in our system architecture from Windows 32Bit to 64Bit, 
our numerical calculation core has to be updated.
Currently we are working with the MATLAB interface of GetFEM version 4.2. 

During tests with the available MATLAB interface of GetFEM version 5.2 I 
noticed that it works much slower
than the interface of version 4.2.

The tests were performed with different test programs of our numerical 
calculation core. 
The runtime difference can be determined to be approximately four times 
higher.

Can anyone explain to me, using the attached test program, where this 
difference could come from?
Are there differences in the implementation of the functions in the 
different versions?

With best regards,

Moritz Jena 


Example test-program: Runtime difference: v4.2 * 3.6 = v5.2 (v4.3: 12.35s 
vs. v5.2: 44.96s)

%%  ---------- Mesh ----------
L = 10;
m = gfMesh('cartesian', 0:.5:L, 0:.5:1, 0:.5:1);

%% ---------- FEM ----------
n = gf_mesh_get(m, 'dim');
k = 1; % Degree

% FEM u
f =  gf_fem(sprintf('FEM_QK(%d,%d)',n,k));
mfu = gf_mesh_fem(m,3); gf_mesh_fem_set(mfu, 'fem', f);

% FEM Von Mises
f2 = gf_fem(sprintf('FEM_QK_DISCONTINUOUS(%d,1)', n));
mfvm = gf_mesh_fem(m,1);  gf_mesh_fem_set(mfvm, 'fem', f2);

%% ---------- IM ----------
k_i = 2*k;
INTEG_TYPE = sprintf('IM_GAUSS_PARALLELEPIPED(%d,%d)',n,k_i);
im = gf_integ(INTEG_TYPE); mim = gf_mesh_im(m,im);

%% ---------- region ----------
P = get(m,'pts');
boundary_left = gf_mesh_get(m, 'faces from pid', find(abs(P(1,:))<1e-6));
boundary_right = gf_mesh_get(m, 'faces from pid', find(abs(P(1,:) - 
L)<1e-6));
gf_mesh_set(m, 'region', 1, boundary_left);
gf_mesh_set(m, 'region', 2, boundary_right);

%% ---------- data ----------
E = 200000;
nu = 0.3;
% Lamé
lambda = nu*E/((1+nu)*(1-2*nu));
mu = E/(2*(1+nu));
%% ---------- model ----------
md = gf_model('real');

gf_model_set(md, 'add fem variable', 'u', mfu);
gf_model_set(md, 'add initialized data', 'lambda', lambda);
gf_model_set(md, 'add initialized data', 'mu', mu);

gf_model_set(md, 'add isotropic linearized elasticity brick', ...
    mim, 'u', 'lambda', 'mu');

% homogenous Dirichlet on the left (region 1)
% gf_model_set(md, 'add Dirichlet condition with penalization', ...
%       mim, 'u', 1e10, 1);
gf_model_set(md, 'add Dirichlet condition with multipliers', ...
    mim, 'u', mfu, 1);

alt = 1; %alternative 1 Force, alternative 2 Displacement

% alternative 1: Force on the right side (region 2)
if alt ==1
    F = [0 -100 0];
    gf_model_set(md, 'add initialized data', 'Kraft', F);
    gf_model_set(md, 'add source term brick', mim, 'u', 'Kraft', 2);
else
    % alternative 2: Displacement on the right side (region 2)
    diri = [0 -1.5 0];
    gf_model_set(md, 'add initialized data', 'dirichletdata', diri);
    gf_model_set(md, 'add Dirichlet condition with penalization', ...
        mim, 'u', 1e10, 2);
    %       gf_model_set(md, 'add Dirichlet condition with multipliers', 
...
    %     mim, 'u', mfu, 2, 'dirichletdata');
end

%% ---------- solving ----------
gf_model_get(md, 'solve');

u = gf_model_get(md, 'variable', 'u');
VM = gf_model_get(md, 'compute isotropic linearized Von Mises or Tresca', 
'u', 'lambda', 'mu', mfvm);

figure
gf_plot(mfvm,VM, 'deformation',u, 'deformation_mf',mfu, 'deformed_mesh', 
...
    'on', 'cvlst', get(m, 'outer faces'), 'deformation_scale', 1, ...
    'disp_options', 'off');
colorbar;
xlabel('x'); ylabel('y'); zlabel('z');

Reply via email to