Hi FreeFem++ developers!
Thank you very much for using FF.
I’d like to repeat the parallel computation using PETSc for implementing topology optimization.
So, I begin with the example elasticity-3d_PETSc.edp from FreeFem examples.
At first, I repeated the same analysis with two different meshes, run with the following code;
//Begin Program
load "medit"
load "PETSc" // PETSc plugin
macro dimension()3// EOM // 2D or 3D
include "macro_ddm.idp" // additional DDM functions
// Define and Load mesh
mesh3 Sh=readmesh3("./ShTrunced_25");
mesh3 ShPlt=Sh;
mesh3 ShPltMoved;
plot(Sh,cmm="FirstMesh");
// Define Boundary Label
int[int] wall(3); wall = [1,7,13]; // fixed displacement
int[int] traction(1); traction = [9]; // traction
//
int[int] n2o;
macro ShN2O()n2o// EOM
func Pk = [P2, P2, P2]; // finite element space
fespace Wh(Sh, Pk);
fespace WhPlt(ShPlt, Pk);
// Parameters
real Young = 1.0e8;
real poisson = 0.45;
real tmp = 1.0 + poisson;
real mu = Young / (2.0 * tmp);
real lambda = Young * poisson / (tmp * (1.0 - 2.0 * poisson));
// Define Solid Mechanics
macro def(i)[i, i#B, i#C]// EOM // vector field definition
macro init(i)[i, i, i]// EOM // vector field initialization
macro gu [gu1,gu2,gu3] // Glabal displacement vector
macro epsilon(u) [dx(u),dy(u#B),dz(u#C),(dz(u#B)+dy(u#C)), (dz(u)+dx(u#C)), (dy(u)+dx(u#B))] // strain tensor
macro D [
[2.*mu+lambda, lambda, lambda, 0, 0, 0 ],
[lambda, 2.*mu+lambda, lambda, 0, 0, 0 ],
[lambda, lambda, 2.*mu+lambda, 0, 0, 0 ],
[0, 0, 0, 2.*mu+lambda, 0, 0 ],
[0, 0, 0, 0, 2.*mu+lambda, 0 ],
[0, 0, 0, 0, 0, 2.*mu+lambda]
] //elastic tensor
//macro g [0,0,-1000000.0] // traction vector
real gZ; gZ = -1000000.0;
macro div(u)(dx(u) + dy(u#B) + dz(u#C))// EOM
WhPlt [pltx, plty, pltz];
WhPlt [reducex, reducey, reducez];
WhPlt [gu1, gu2, gu3];
Wh def(u);
real[int] sol;
int[int] rest;
varf vPb(def(u), def(v)) = int3d(Sh)((D*epsilon(u))'*epsilon(v))
+int2d(Sh,traction)(gZ*vC)
+ on(wall, u = 0.0, uB = 0.0, uC = 0.0); // '
Mat A;
//---------------------------------1stAnalysis---------------------------------
buildDmesh(Sh);
createMat(Sh, A, Pk)
A = vPb(Wh, Wh);
real[int] rhs = vPb(0, Wh);
set(A, sparams = "-pc_type cholesky -ksp_view -ksp_max_it 100", bs = 3);
u[] = A^-1 * rhs;
if(!NoGraphicWindow) {
ChangeNumbering(A, u[], sol);
ChangeNumbering(A, u[], sol, inverse = true);
rest = restrict(Wh, WhPlt, n2o);
for[i, v : rest] pltx[][v] = u[][i];
mpiReduce(pltx[], reducex[], processor(0, mpiCommWorld), mpiSUM);
}
gu1[]=reducex[];
gu2[]=reducey[];
gu3[]=reducez[];
ShPltMoved = movemesh3(ShPlt,transfo=[x+gu1,y+gu2,z+gu3]);
plot(ShPltMoved,cmm="Deformation1");
//-----------------------------------------------------------------------------
//Load Next Different Mesh
Sh=readmesh3("./ShTrunced_50");
ShPlt=Sh;
plot(Sh,cmm="SecondMesh");
//---------------------------------2ndAnalysis----------------------------------
buildDmesh(Sh);
createMat(Sh, A, Pk)
A = vPb(Wh, Wh);
rhs = vPb(0, Wh);
set(A, sparams = "-pc_type cholesky -ksp_view -ksp_max_it 100", bs = 3);
u[] = A^-1 * rhs;
if(!NoGraphicWindow) {
ChangeNumbering(A, u[], sol);
ChangeNumbering(A, u[], sol, inverse = true);
rest = restrict(Wh, WhPlt, n2o);
for[i, v : rest] pltx[][v] = u[][i];
mpiReduce(pltx[], reducex[], processor(0, mpiCommWorld), mpiSUM);
}
gu1[]=reducex[];
gu2[]=reducey[];
gu3[]=reducez[];
ShPltMoved = movemesh3(ShPlt,transfo=[x+gu1,y+gu2,z+gu3]);
plot(ShPltMoved,cmm="Deformation2");
//End Program
When I do that, I get an error.
current line = 96 mpirank 3 / 4
current line = 96 mpirank 0 / 4
Exec error : AssembleLinearForm size rhs and nb of DF of Vh
** – number :1**
** current line = 96 mpirank 2 / 4**
** current line = 96 mpirank 1 / 4**
Exec error : AssembleLinearForm size rhs and nb of DF of Vh
** – number :1**
** err code 8 , mpirank 0**
Exec error : AssembleLinearForm size rhs and nb of DF of Vh
** – number :1**
** err code 8 , mpirank 3**
Exec error : AssembleLinearForm size rhs and nb of DF of Vh
** – number :1**
** err code 8 , mpirank 1**
Exec error : AssembleLinearForm size rhs and nb of DF of Vh
** – number :1**
** err code 8 , mpirank 2**
I confirmed that multiple analysis runs can be performed on the same mesh.
I don’t know what procedures are required in case of a mesh change.
I’m very sorry if a similar question has already been asked and this is a rudimentary question.
I am sure you are very busy, but I would appreciate your guidance.