Je travaille récemment sur la méthode des éléments finis avec MatlabPassing fonction poignée comme entrée pour Matlab pour
j'ai essayé d'optimiser mon code en MATLAB.
Lors de la recherche, j'ai trouvé que l'assemblage de la matrice pourrait être accéléré en utilisant la fonction mex. Pendant le portage de mon "PoissonAssembler.m" à la fonction mex, j'ai rencontré quelques problèmes. PoissonAssembler.m a fondamentalement ce genre de structure.
for every element{
loc_stiff_assmbl();
loc_rhs_assmbl(); // this one involves with function evaluation @(x,y)
for every edges{
loc_edge_assmbl();
if boundary{
loc_rhs_edge_assmbl(); // this one also have function eval
}
}
}
Dans Matlab, je
f = @(x,y) some_math_function;
Étant donné que cette fonction sera modifiée pour d'autres simulation numérique,
Je voulais utiliser la poignée de fonction comme entrée pour le fichier MEX
I trouvé qu'il y a un moyen de le faire en utilisant mexCallMatlab() et feval. Cependant, je pense que cela va ralentir mon code à cause de la surcharge causée par l'appel de matlab.
Y at-il un moyen de l'éviter sans compiler le fichier mex chaque fois que je change la poignée de fonction?
code plus précise est comme ce
for (k=0;k<nE;k++){ // nE : number of elements (about 10^5 to 10^6)
// other assembling procedure
blabla
// function evaluation for rhs assemble
for (i=0; i<nP; i++){ // nP : number of points in element
fxy[i] = f(x[i],y[i])};
}
// rhs assemble
for (j=0; j<nP; j++){
for (i=0; i<nP; i++){ // matrix vector multiplication
rhs[k*nE + j] += Mass[ i*nP + j]*fxy[i];
}
}
// face loop
for (f1 = 0; f1 < nF4E; f1++){ // number of face for each elements
switch(BCType[k1*nF4E + f1]){ // if boundary
case 1 : // Dirichlet
// inner product with evaluation of gD = @(x,y) function
CODE OMITTED
case 2 : // Neumann
// inner product with evaluation of gN = @(x,y) function
CODE OMITTED
}
}
}
De combien de fonctions avez-vous vraiment besoin pour le transmettre? Une option consiste à vectoriser votre fonction afin que vous puissiez passer tous les visages/éléments à la fois plutôt que de l'appeler dans une boucle. – Suever
Le meilleur scénario ici est probablement de créer votre fonction mex avec un switch pour les fonctions possibles .... L'avantage de MATLAB est qu'il est très flexible, l'avantage de C est qu'il est très rapide. Vous ne pouvez pas avoir les deux, j'ai peur –