<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hi All,<br>
<br>
I use DMDA for a flow problem and found the local vector and global
vector does not match for 2D and 3D problem when dof >1.<br>
<br>
For example, the mesh is as follows:<br>
<br>
|proc 1| proc 2 | proc 3 |<br>
|7 8 9|16 17 18|25 26 27|<br>
|4 5 6|13 14 15|22 23 24|<br>
|1 2 3|10 11 12|19 20 21|<br>
<br>
<font color="#ff0000"><i>The following functions are used to create
DMDA object, global vector and local vector.</i></font><br>
<br>
call DMDACreate2d(Petsc_Comm_World,DMDA_BOUNDARY_NONE, &<br>
DMDA_BOUNDARY_NONE,
DMDA_STENCIL_BOX, &<br>
nvxgbl,nvzgbl,PETSC_DECIDE,PETSC_DECIDE, &<br>
dmda_flow%dof,
dmda_flow%swidth, &<br>
PETSC_NULL_INTEGER,PETSC_NULL_INTEGER, &<br>
dmda_flow%da,ierr) <br>
call DMCreateGlobalVector(dmda_flow%da,x_flow,ierr)<br>
call VecDuplicate(x_flow,b_flow,ierr)<br>
call DMCreateLocalVector(dmda_flow%da,x_flow_loc,ierr)<br>
call VecDuplicate(x_flow_loc,b_flow_loc,ierr)<br>
<br>
<i><font color="#ff0000">The following functions are used to compute
the function (b_flow_loc)</font></i><br>
<br>
call VecGetArrayF90(b_flow_loc, vecpointer, ierr)<br>
<font color="#000099">vecpointer = (compute the values here...)</font><br>
call VecRestoreArrayF90(b_flow_loc,vecpointer,ierr)<br>
call
DMLocalToGlobalBegin(dmda_flow%,b_flow_loc,INSERT_VALUES,
&<br>
b_flow,ierr)<br>
call
DMLocalToGlobalEnd(dmda_flow%,b_flow_loc,INSERT_VALUES,
&<br>
b_flow,ierr)<br>
<br>
<br>
<i><font color="#ff0000">The data of local vector b_flow_loc for
proc1, proc2 and proc3 are as follows (just an example, without
ghost value)</font></i><br>
proc 1 proc 2 proc 3<br>
1 10 19<br>
2 11 20<br>
3 12 21<br>
4 13 22<br>
5 14 23<br>
6 15 24<br>
... ... ...<br>
<br>
<i><font color="#ff0000">But the global vector b_flow from Vecview
shows that the data is stored as follows (left column). I
thought the global vector b_flow is like the right column. Is
anything wrong here?</font></i><br>
<br>
Process [0] Process [0]<br>
1 1<br>
2 2<br>
3 3<br>
10 4<br>
11 5<br>
12 6<br>
... ... <br>
Process [1] Process [1]<br>
4 10<br>
5 11<br>
6 12<br>
13 13<br>
14 14<br>
15 15<br>
... ...<br>
Process [2] Process [2]<br>
... ...<br>
<br>
Though the data distribution is different from what I thought
before, the code works well for 1D problem and most of the 2D and 3D
problem, but failed in newton iteration for some 2D problem with dof
> 1. I use KSP solver, not SNES solver at present.<br>
<br>
Thanks and regards,<br>
<br>
Danyang<br>
<br>
<br>
</body>
</html>