[petsc-users] using petsc tools to solve isolated irregular domains with finite difference
Bishesh Khanal
bisheshkh at gmail.com
Mon Nov 11 13:08:45 CST 2013
On Mon, Nov 4, 2013 at 5:25 PM, Bishesh Khanal <bisheshkh at gmail.com> wrote:
>
>
>
> On Mon, Nov 4, 2013 at 4:54 PM, Matthew Knepley <knepley at gmail.com> wrote:
>
>> On Mon, Nov 4, 2013 at 4:49 AM, Bishesh Khanal <bisheshkh at gmail.com>wrote:
>>
>>> On Fri, Nov 1, 2013 at 1:30 PM, Matthew Knepley <knepley at gmail.com>wrote:
>>>
>>>> On Fri, Nov 1, 2013 at 12:08 AM, Bishesh Khanal <bisheshkh at gmail.com>wrote:
>>>>
>>>>> On Thu, Oct 31, 2013 at 11:34 PM, Matthew Knepley <knepley at gmail.com>wrote:
>>>>>
>>>>>> On Thu, Oct 31, 2013 at 5:02 PM, Bishesh Khanal <bisheshkh at gmail.com>wrote:
>>>>>>
>>>>>>> On Thu, Oct 31, 2013 at 7:43 PM, Matthew Knepley <knepley at gmail.com>wrote:
>>>>>>>
>>>>>>>> On Thu, Oct 31, 2013 at 1:25 PM, Bishesh Khanal <
>>>>>>>> bisheshkh at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> I did not call DMCreateMatrix() before when using just dmda (and
>>>>>>>>> it is working). In any case, I added a call to DMCreateMatrix() now but
>>>>>>>>> still there are problems. Here are the code snippets and the error I get:
>>>>>>>>>
>>>>>>>>
>>>>>>>> Then you were allowing it to be called automatically by PETSc, and
>>>>>>>> it would have been this time as well.
>>>>>>>>
>>>>>>>>
>>>>>>>>> //Setting up the section and linking it to DM:
>>>>>>>>> ierr = PetscSectionCreate(PETSC_COMM_WORLD, &s);CHKERRQ(ierr);
>>>>>>>>> ierr = DMDAGetNumCells(dm, NULL, NULL, NULL,
>>>>>>>>> &nC);CHKERRQ(ierr);
>>>>>>>>> ierr = PetscSectionSetChart(s, 0, nC);CHKERRQ(ierr);
>>>>>>>>> for (PetscInt j = info.ys; j < info.ys+info.ym; ++j) {
>>>>>>>>> for (PetscInt i = info.xs; i < info.xs+info.xm; ++i) {
>>>>>>>>> PetscInt point;
>>>>>>>>> if(isPosInDomain(&testPoisson,i,j,0)) {
>>>>>>>>> ierr = DMDAGetCellPoint(dm, i, j, 0,
>>>>>>>>> &point);CHKERRQ(ierr);
>>>>>>>>> ierr = PetscSectionSetDof(s, point,
>>>>>>>>> testPoisson.mDof); // No. of dofs associated with the point.
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>> ierr = PetscSectionSetUp(s);CHKERRQ(ierr);
>>>>>>>>> ierr = DMSetDefaultSection(dm, s);CHKERRQ(ierr);
>>>>>>>>> ierr = PetscSectionDestroy(&s);CHKERRQ(ierr);
>>>>>>>>> ierr = DMCreateMatrix(dm,&A);CHKERRQ(ierr);
>>>>>>>>>
>>>>>>>>> //Set up KSP:
>>>>>>>>> ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr);
>>>>>>>>> ierr = KSPSetDM(ksp,dm);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> KSPSetComputeOperators(ksp,computeMatrix2dSection,(void*)&testPoisson);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> KSPSetComputeRHS(ksp,computeRhs2dSection,(void*)&testPoisson);CHKERRQ(ierr);
>>>>>>>>> ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr);
>>>>>>>>> ierr = KSPSolve(ksp,NULL,NULL);CHKERRQ(ierr);
>>>>>>>>>
>>>>>>>>> ------------------------------------------------------
>>>>>>>>> The computeMatrix2dSection function has:
>>>>>>>>>
>>>>>>>>> ierr = KSPGetDM(ksp,&da);CHKERRQ(ierr);
>>>>>>>>> ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
>>>>>>>>> ierr = DMGetDefaultGlobalSection(da,&gs);CHKERRQ(ierr);
>>>>>>>>> for(PetscInt j = info.ys; j<info.ys+info.ym; ++j) {
>>>>>>>>> for(PetscInt i = info.xs; i<info.xs+info.xm; ++i) {
>>>>>>>>> if (isPosInDomain(ctx,i,j)) {
>>>>>>>>> ierr =
>>>>>>>>> DMDAGetCellPoint(da,i,j,0,&point);CHKERRQ(ierr);
>>>>>>>>> ierr = PetscSectionGetOffset(gs,point,&row);
>>>>>>>>> ierr = PetscSectionGetDof(gs,point,&dof);
>>>>>>>>> for(PetscInt cDof = 0; cDof < dof; ++cDof) {
>>>>>>>>> num = 0;
>>>>>>>>> row+=cDof;
>>>>>>>>> col[num] = row; //(i,j) position
>>>>>>>>> v[num++] = -4;
>>>>>>>>> if(isPosInDomain(ctx,i+1,j)) {
>>>>>>>>> ierr =
>>>>>>>>> DMDAGetCellPoint(da,i+1,j,0,&point);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> PetscSectionGetOffset(gs,point,&col[num]);
>>>>>>>>> col[num] += cDof;
>>>>>>>>> v[num++] = 1;
>>>>>>>>> }
>>>>>>>>> if(isPosInDomain(ctx,i-1,j)) {
>>>>>>>>> ierr =
>>>>>>>>> DMDAGetCellPoint(da,i-1,j,0,&point);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> PetscSectionGetOffset(gs,point,&col[num]);
>>>>>>>>> col[num] += cDof;
>>>>>>>>> v[num++] = 1;
>>>>>>>>> }
>>>>>>>>> if(isPosInDomain(ctx,i,j+1)) {
>>>>>>>>> ierr =
>>>>>>>>> DMDAGetCellPoint(da,i,j+1,0,&point);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> PetscSectionGetOffset(gs,point,&col[num]);
>>>>>>>>> col[num] += cDof;
>>>>>>>>> v[num++] = 1;
>>>>>>>>> }
>>>>>>>>> if(isPosInDomain(ctx,i,j-1)) {
>>>>>>>>> ierr =
>>>>>>>>> DMDAGetCellPoint(da,i,j-1,0,&point);CHKERRQ(ierr);
>>>>>>>>> ierr =
>>>>>>>>> PetscSectionGetOffset(gs,point,&col[num]);
>>>>>>>>> col[num] += cDof;
>>>>>>>>> v[num++] = 1;
>>>>>>>>> }
>>>>>>>>> ierr =
>>>>>>>>> MatSetValues(A,1,&row,num,col,v,INSERT_VALUES);CHKERRQ(ierr);
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>> }
>>>>>>>>> ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
>>>>>>>>> ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
>>>>>>>>>
>>>>>>>>> But this is not working. For e.g. for a 6X6 grid size I get the
>>>>>>>>> following error:
>>>>>>>>>
>>>>>>>>
>>>>>>>> Okay, here is how to debug this:
>>>>>>>>
>>>>>>>> 0) Go to a single scalar equations to make things easier
>>>>>>>>
>>>>>>>> 1) Use MatView(A, PETSC_VIEWER_STDOUT_WORLD), which should output
>>>>>>>> a 36 row matrix with
>>>>>>>> the preallocated nonzero pattern, filled with zeros
>>>>>>>>
>>>>>>>> 2) Make sure this is the pattern you want
>>>>>>>>
>>>>>>>> 3) Run in the debugger with -start_in_debugger
>>>>>>>>
>>>>>>>> 4) When you get the error, see
>>>>>>>>
>>>>>>>> a) If the (i, j) is one that should be setting a value
>>>>>>>>
>>>>>>>> b) Why this (i, j) was not preallocated
>>>>>>>>
>>>>>>>
>>>>>>> Up to 4 (a), it is correct. There is a problem in the way
>>>>>>> DMDAGetCellPoint and PetscSectionGetOffset works in this case scenario. I
>>>>>>> will try to explain it below for the case of 4X4 grid.
>>>>>>> First case:
>>>>>>> If I set the computational domain to be all the points of the dmda
>>>>>>> grid, (i.e. isPosInDomain(..,i,j,..) returns true for all i and j in the
>>>>>>> dmda grid), the program runs fine and does not give any error.
>>>>>>>
>>>>>>> Second case:
>>>>>>> I want the computational domain to be some part of the whole grid.
>>>>>>> There is a problem in this case.
>>>>>>> The following test is in a case where,
>>>>>>> isPosInDomain(..,i,j,..) returns true ONLY for (i,j) pairs of (2,1)
>>>>>>> (1,2) (2,2) (3,2) and (3,2). The grid with its corresponding point number
>>>>>>> in the petscsection is shown below:
>>>>>>>
>>>>>>> 12 13 14 15
>>>>>>> 8 9 10 11
>>>>>>> 4 5 6 7
>>>>>>> 0 1 2 3
>>>>>>>
>>>>>>> of which 6, 9, 10, 11 and 14 correspond to the (i,j) points that
>>>>>>> returns true for isPosInDomain(..,i,j,..)
>>>>>>> MatView gives me the 16-row matrix with the star stencil non-zero
>>>>>>> structure as expected.
>>>>>>> The error I get is: new non-zero at (0,2) caused a malloc.
>>>>>>>
>>>>>>> This error is for the value of (i,j) = (2,1), i.e. point 6.
>>>>>>> The loop to set values in the matrix starts as:
>>>>>>> for(PetscInt j = info.ys; j<info.ys+info.ym; ++j) {
>>>>>>> for(PetscInt i = info.xs; i<info.xs+info.xm; ++i) {
>>>>>>> if (isPosInDomain(ctx,i,j)) {
>>>>>>> ierr =
>>>>>>> DMDAGetCellPoint(da,i,j,0,&point);CHKERRQ(ierr);
>>>>>>> ierr = PetscSectionGetOffset(gs,point,&row);
>>>>>>>
>>>>>>> Now, what I wanted from the beginning is to create the matrix
>>>>>>> containing the rows corresponding to only those points (i,j) which has true
>>>>>>> values for isPosInDomain(ctx,i,j), that means in this case 5 row matrix. In
>>>>>>> the current test, the first (i,j) that reaches DMDAGetCellPoint is (2,1),
>>>>>>> which gives sets point variable to 6.
>>>>>>> The line PetscSectionGetOffset(gs,point,&row) sets the value of row
>>>>>>> to 0.
>>>>>>> So I think this where the inconsistency lies.
>>>>>>> MatSetValues(A,1,&row,num,col,v,INSERT_VALUES) expects row variable
>>>>>>> and col[] array to correspond to (i,j) based on DMDA, but
>>>>>>> PetsSectionGetOffset gives result based on how we masked away some of the
>>>>>>> points from dmda grid. Or am I missing something very basic here ?
>>>>>>>
>>>>>>
>>>>>> You are missing something basic. The row is correctly identified as
>>>>>> 0, and that means the 2 is
>>>>>> point 10.
>>>>>>
>>>>> The problem must be preallocation. First, you should send the result
>>>>>> of MatView().
>>>>>>
>>>>>
>>>>> MatView shows that the preallocation and the matrix created is for the
>>>>> full dmda grid which is probably not what we want here, right ? Here is the
>>>>> matview result:
>>>>>
>>>>
>>>> Thats right. Did you call
>>>>
>>>> DMSetDefaultSection(da, s)
>>>>
>>>> after you made the new section and before you called DMGetMatrix()?
>>>>
>>> Do you mean before I called DMCreateMatrix() ? I called
>>> DMSetDefaultSection(da,s) as below:
>>>
>>> ...
>>> ierr = PetscSectionSetUp(s);CHKERRQ(ierr);
>>> ierr = DMSetDefaultSection(dm, s);CHKERRQ(ierr);
>>> ierr = PetscSectionDestroy(&s);CHKERRQ(ierr);
>>> // ierr = DMGetMatrix(dm,&A);CHKERRQ(ierr); //It seems DMGetMatrix
>>> is changed to DMCreateMatrix().
>>> ierr = DMCreateMatrix(dm,&A);CHKERRQ(ierr);
>>> ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
>>>
>>
>> Yes, this is correct. I do exactly this in the example code and it works
>> fine. I suspect
>> you are not creating the section you think you are. You can send the
>> code if you want
>> and I will look at it.
>>
>
> Thanks, here is the code:
> https://github.com/bishesh/petscPoissonIrregular/blob/master/poissonIrregular.cxx
> It works for 2D and 3D without using PetscSection. (The choice of using
> Petsc_section is on line 68). Using PetsSection currently it implements
> only the 2D case with dof = 1. It works when the domain consists of all the
> cells of the dmda, it works (to check you can uncomment line 129 in
> isPosInDomain(). But it does not when I mask out some of the cells while
> creating the petscsection.
>
Hi Matt, I'm afraid if my last email somehow escaped you. Could you please
let me know what could be possibly going wrong with my code linked above ?
>
>
>>
>> Matt
>>
>>
>>> This MatView on A shows (result below) that it still has 16 rows for all
>>> DMDA points instead of only those petscsection points for which I set a
>>> non-zero dof. Is it what it should not be doing ?
>>>
>>>> Mat Object: 1 MPI processes
>>>>>
>>>>> type: seqaij
>>>>>
>>>>> row 0: (0, 0) (1, 0) (4, 0)
>>>>>
>>>>> row 1: (0, 0) (1, 0) (2, 0) (5, 0)
>>>>>
>>>>> row 2: (1, 0) (2, 0) (3, 0) (6, 0)
>>>>>
>>>>> row 3: (2, 0) (3, 0) (7, 0)
>>>>>
>>>>> row 4: (0, 0) (4, 0) (5, 0) (8, 0)
>>>>>
>>>>> row 5: (1, 0) (4, 0) (5, 0) (6, 0) (9, 0)
>>>>>
>>>>> row 6: (2, 0) (5, 0) (6, 0) (7, 0) (10, 0)
>>>>>
>>>>> row 7: (3, 0) (6, 0) (7, 0) (11, 0)
>>>>>
>>>>> row 8: (4, 0) (8, 0) (9, 0) (12, 0)
>>>>>
>>>>> row 9: (5, 0) (8, 0) (9, 0) (10, 0) (13, 0)
>>>>>
>>>>> row 10: (6, 0) (9, 0) (10, 0) (11, 0) (14, 0)
>>>>>
>>>>> row 11: (7, 0) (10, 0) (11, 0) (15, 0)
>>>>>
>>>>> row 12: (8, 0) (12, 0) (13, 0)
>>>>>
>>>>> row 13: (9, 0) (12, 0) (13, 0) (14, 0)
>>>>>
>>>>> row 14: (10, 0) (13, 0) (14, 0) (15, 0)
>>>>>
>>>>> row 15: (11, 0) (14, 0) (15, 0)
>>>>>
>>>>> [0]PETSC ERROR: --------------------- Error Message
>>>>> ------------------------------------
>>>>>
>>>>> [0]PETSC ERROR: Argument out of range!
>>>>>
>>>>> [0]PETSC ERROR: New nonzero at (0,2) caused a malloc!
>>>>>
>>>>>
>>>>>
>>> For reference here is the code snippet again:
>>> ...
>>> ierr = PetscSectionCreate(PETSC_COMM_WORLD, &s);CHKERRQ(ierr);
>>> ierr = DMDAGetNumCells(dm, NULL, NULL, NULL, &nC);CHKERRQ(ierr);
>>> ierr = PetscSectionSetChart(s, 0, nC);CHKERRQ(ierr);
>>> for (PetscInt j = info.ys; j < info.ys+info.ym; ++j) {
>>> for (PetscInt i = info.xs; i < info.xs+info.xm; ++i) {
>>> PetscInt point;
>>> if(isPosInDomain(&testPoisson,i,j,0)) {
>>> ierr = DMDAGetCellPoint(dm, i, j, 0,
>>> &point);CHKERRQ(ierr);
>>> ierr = PetscSectionSetDof(s, point, testPoisson.mDof);
>>> // No. of dofs associated with the point.
>>> }
>>> }
>>> }
>>> ierr = PetscSectionSetUp(s);CHKERRQ(ierr);
>>> ierr = DMSetDefaultSection(dm, s);CHKERRQ(ierr);
>>> ierr = PetscSectionDestroy(&s);CHKERRQ(ierr);
>>> ierr = DMCreateMatrix(dm,&A);CHKERRQ(ierr);
>>> ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
>>>
>>> ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr);
>>> ierr = KSPSetDM(ksp,dm);CHKERRQ(ierr);
>>>
>>> ierr =
>>> KSPSetComputeOperators(ksp,computeMatrix2dSection,(void*)&testPoisson);CHKERRQ(ierr);
>>> ierr =
>>> KSPSetComputeRHS(ksp,computeRhs2dSection,(void*)&testPoisson);CHKERRQ(ierr);
>>>
>>> ....
>>> The function computeMatrix2dSection:
>>>
>>> #undef __FUNCT__
>>> #define __FUNCT__ "computeMatrix2dSection"
>>> PetscErrorCode computeMatrix2dSection(KSP ksp, Mat A, Mat B,
>>> MatStructure *str, void *context) {
>>> PoissonModel *ctx = (PoissonModel*)context;
>>> PetscErrorCode ierr;
>>> DM da;
>>> DMDALocalInfo info;
>>> PetscInt row, col[5];
>>> PetscInt dof;
>>> PetscScalar v[5]; //array to store 5 point stencil for
>>> each row
>>> PetscInt num; //non-zero position in the current row
>>> // PetscScalar dScale = 1; //to scale Dirichlet
>>> identity rows if needed
>>> PetscSection gs; //Global Section that keeps
>>> the grid info and indices
>>> PetscInt point; //Current point of the
>>> petscSection
>>>
>>> PetscFunctionBeginUser;
>>> ierr = KSPGetDM(ksp,&da);CHKERRQ(ierr);
>>> ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
>>> ierr = DMGetDefaultGlobalSection(da,&gs);CHKERRQ(ierr);
>>> ierr = DMCreateMatrix(da,&A);CHKERRQ(ierr);
>>> // ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
>>> for(PetscInt j = info.ys; j<info.ys+info.ym; ++j) {
>>> for(PetscInt i = info.xs; i<info.xs+info.xm; ++i) {
>>> if (isPosInDomain(ctx,i,j)) {
>>> ierr = DMDAGetCellPoint(da,i,j,0,&point);CHKERRQ(ierr);
>>> ierr = PetscSectionGetOffset(gs,point,&row);
>>> ierr = PetscSectionGetDof(gs,point,&dof);
>>> for(PetscInt cDof = 0; cDof < ctx->mDof; ++cDof) {
>>> num = 0;
>>> row+=cDof;
>>> col[num] = row; //(i,j) position
>>> v[num++] = -4;
>>> if(isPosInDomain(ctx,i+1,j)) {
>>> ierr =
>>> DMDAGetCellPoint(da,i+1,j,0,&point);CHKERRQ(ierr);
>>> ierr = PetscSectionGetOffset(gs,point,&col[num]);
>>> col[num] += cDof;
>>> v[num++] = 1;
>>> }
>>> if(isPosInDomain(ctx,i-1,j)) {
>>> ierr =
>>> DMDAGetCellPoint(da,i-1,j,0,&point);CHKERRQ(ierr);
>>> ierr = PetscSectionGetOffset(gs,point,&col[num]);
>>> col[num] += cDof;
>>> v[num++] = 1;
>>> }
>>> if(isPosInDomain(ctx,i,j+1)) {
>>> ierr =
>>> DMDAGetCellPoint(da,i,j+1,0,&point);CHKERRQ(ierr);
>>> ierr = PetscSectionGetOffset(gs,point,&col[num]);
>>> col[num] += cDof;
>>> v[num++] = 1;
>>> }
>>> if(isPosInDomain(ctx,i,j-1)) {
>>> ierr =
>>> DMDAGetCellPoint(da,i,j-1,0,&point);CHKERRQ(ierr);
>>> ierr = PetscSectionGetOffset(gs,point,&col[num]);
>>> col[num] += cDof;
>>> v[num++] = 1;
>>> }
>>> ierr =
>>> MatSetValues(A,1,&row,num,col,v,INSERT_VALUES);CHKERRQ(ierr);
>>> }
>>> }
>>> }
>>> }
>>> ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
>>> ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
>>>
>>>
>>>
>>>
>>>>
>>>>>> Matt
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>> Matt
>>>>>>>>
>>>>>>>>
>>>>>>>>> [0]PETSC ERROR: --------------------- Error Message
>>>>>>>>> ------------------------------------
>>>>>>>>> [0]PETSC ERROR: Argument out of range!
>>>>>>>>> [0]PETSC ERROR: New nonzero at (0,6) caused a malloc!
>>>>>>>>> [0]PETSC ERROR:
>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>> [0]PETSC ERROR: Petsc Development GIT revision:
>>>>>>>>> 61e5e40bb2c5bf2423e94b71a15fef47e411b0da GIT Date: 2013-10-25 21:47:45
>>>>>>>>> -0500
>>>>>>>>> [0]PETSC ERROR: See docs/changes/index.html for recent updates.
>>>>>>>>> [0]PETSC ERROR: See docs/faq.html for hints about trouble shooting.
>>>>>>>>> [0]PETSC ERROR: See docs/index.html for manual pages.
>>>>>>>>> [0]PETSC ERROR:
>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>> [0]PETSC ERROR: build/poissonIrregular on a arch-linux2-cxx-debug
>>>>>>>>> named edwards by bkhanal Thu Oct 31 19:23:58 2013
>>>>>>>>> [0]PETSC ERROR: Libraries linked from
>>>>>>>>> /home/bkhanal/Documents/softwares/petsc/arch-linux2-cxx-debug/lib
>>>>>>>>> [0]PETSC ERROR: Configure run at Sat Oct 26 16:35:15 2013
>>>>>>>>> [0]PETSC ERROR: Configure options --download-mpich
>>>>>>>>> -download-f-blas-lapack=1 --download-metis --download-parmetis
>>>>>>>>> --download-superlu_dist --download-scalapack --download-mumps
>>>>>>>>> --download-hypre --with-clanguage=cxx
>>>>>>>>> [0]PETSC ERROR:
>>>>>>>>> ------------------------------------------------------------------------
>>>>>>>>> [0]PETSC ERROR: MatSetValues_SeqAIJ() line 413 in
>>>>>>>>> src/mat/impls/aij/seq/aij.c
>>>>>>>>> [0]PETSC ERROR: MatSetValues() line 1130 in
>>>>>>>>> src/mat/interface/matrix.c
>>>>>>>>> [0]PETSC ERROR: computeMatrix2dSection() line 318 in
>>>>>>>>> /user/bkhanal/home/works/poissonIrregular/poissonIrregular.cxx
>>>>>>>>> [0]PETSC ERROR: KSPSetUp() line 228 in
>>>>>>>>> src/ksp/ksp/interface/itfunc.c
>>>>>>>>> [0]PETSC ERROR: KSPSolve() line 399 in
>>>>>>>>> src/ksp/ksp/interface/itfunc.c
>>>>>>>>> [0]PETSC ERROR: main() line 598 in
>>>>>>>>> /user/bkhanal/home/works/poissonIrregular/poissonIrregular.cxx
>>>>>>>>> application called MPI_Abort(MPI_COMM_WORLD, 63) - process 0
>>>>>>>>> [unset]: aborting job:
>>>>>>>>> application called MPI_Abort(MPI_COMM_WORLD, 63) - process 0
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Matt
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> However, now since I do not want the rows in the matrix
>>>>>>>>>>> corresponding to the points in the grid which do not lie in the
>>>>>>>>>>> computational domain. This means the size of the matrix will not
>>>>>>>>>>> necessarily equal the total number of cells in DMDA. So in the following
>>>>>>>>>>> code:
>>>>>>>>>>>
>>>>>>>>>>> ierr = DMDAGetLocalInfo(dm,&info);CHKERRQ(ierr);
>>>>>>>>>>> ierr = PetscSectionCreate(PETSC_COMM_WORLD,
>>>>>>>>>>> &s);CHKERRQ(ierr);
>>>>>>>>>>> ierr = DMDAGetNumCells(dm, NULL, NULL, NULL,
>>>>>>>>>>> &nC);CHKERRQ(ierr);
>>>>>>>>>>> ierr = PetscSectionSetChart(s, 0, nC);CHKERRQ(ierr);
>>>>>>>>>>> for (PetscInt j = info.ys; j < info.ys+info.ym; ++j) {
>>>>>>>>>>> for (PetscInt i = info.xs; i < info.xs+info.xm; ++i) {
>>>>>>>>>>> PetscInt point;
>>>>>>>>>>> if(isPosInDomain(&testPoisson,i,j,0)) {
>>>>>>>>>>> ierr = DMDAGetCellPoint(dm, i, j, 0,
>>>>>>>>>>> &point);CHKERRQ(ierr);
>>>>>>>>>>> ierr = PetscSectionSetDof(s, point,
>>>>>>>>>>> testPoisson.mDof); // No. of dofs associated with the point.
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> }
>>>>>>>>>>> }
>>>>>>>>>>> ierr = PetscSectionSetUp(s);CHKERRQ(ierr);
>>>>>>>>>>> ierr = DMSetDefaultSection(dm, s);CHKERRQ(ierr);
>>>>>>>>>>> ierr = PetscSectionDestroy(&s);CHKERRQ(ierr);
>>>>>>>>>>>
>>>>>>>>>>> should I myself compute proper nC (i.e. total no. of points for
>>>>>>>>>>> which I want the matrix to have a corresponding row) before calling
>>>>>>>>>>> PetscSectionSetChart() or is the masking out of the points inside the loop
>>>>>>>>>>> with if(isPosInDomain(&testPoisson,i,j,0)) sufficient ?
>>>>>>>>>>> And, when you write:
>>>>>>>>>>> PetscSectionGetOffset(gs, p, &ind);
>>>>>>>>>>> row = ind < 0 ? -(ind+1) : ind;
>>>>>>>>>>>
>>>>>>>>>>> it seems you allow the possibility of getting a -ve ind when
>>>>>>>>>>> using PetscSectionGetOffset. When would an offset to a particular dof and
>>>>>>>>>>> point?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> for(PetscInt j = info.ys; j<info.ys+info.ym; ++j) {
>>>>>>>>>>>>> for(PetscInt i = info.xs; i<info.xs+info.xm; ++i) {
>>>>>>>>>>>>> num = 0;
>>>>>>>>>>>>> /*ierr =
>>>>>>>>>>>>> DMDAGetCellPoint(da,i,j,0,&point);CHKERRQ(ierr);*/ /*Get the PetscPoint*/
>>>>>>>>>>>>> /*But I did now understand how I would emulate
>>>>>>>>>>>>> the row.c and col.c info with PetscSection*/
>>>>>>>>>>>>> row.i = i; row.j = j;
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Here you would call
>>>>>>>>>>>>
>>>>>>>>>>>> ierr = DMDAGetCellPoint(da, i, j, 0, &cell);CHKERRQ(ierr);
>>>>>>>>>>>> ierr = PetscSectionGetOffset(da, cell, &row);CHKERRQ(ierr);
>>>>>>>>>>>> ierr = PetscSectionGetDof(da, cell, &dof);CHKERRQ(ierr);
>>>>>>>>>>>>
>>>>>>>>>>>> This means that this cell has global rows = [row, row+dof).
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> col[num].i = i; col[num].j = j;
>>>>>>>>>>>>> if (isPosInDomain(ctx,i,j)) { /*put the
>>>>>>>>>>>>> operator for only the values for only the points lying in the domain*/
>>>>>>>>>>>>> v[num++] = -4;
>>>>>>>>>>>>> if(isPosInDomain(ctx,i+1,j)) {
>>>>>>>>>>>>> col[num].i = i+1; col[num].j = j;
>>>>>>>>>>>>> v[num++] = 1;
>>>>>>>>>>>>> }
>>>>>>>>>>>>> if(isPosInDomain(ctx,i-1,j)) {
>>>>>>>>>>>>> col[num].i = i-1; col[num].j = j;
>>>>>>>>>>>>> v[num++] = 1;
>>>>>>>>>>>>> }
>>>>>>>>>>>>> if(isPosInDomain(ctx,i,j+1)) {
>>>>>>>>>>>>> col[num].i = i; col[num].j = j+1;
>>>>>>>>>>>>> v[num++] = 1;
>>>>>>>>>>>>> }
>>>>>>>>>>>>> if(isPosInDomain(ctx,i,j-1)) {
>>>>>>>>>>>>> col[num].i = i; col[num].j = j-1;
>>>>>>>>>>>>> v[num++] = 1;
>>>>>>>>>>>>> }
>>>>>>>>>>>>> } else {
>>>>>>>>>>>>> v[num++] = dScale; /*set Dirichlet
>>>>>>>>>>>>> identity rows for points in the rectangle but outside the computational
>>>>>>>>>>>>> domain*/
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> You do the same thing for the columns, and then call
>>>>>>>>>>>>
>>>>>>>>>>>> ierr = MatSetValues(A, dof, rows, num*dof, cols, v,
>>>>>>>>>>>> INSERT_VALUES);CHKERRQ(ierr);
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> ierr =
>>>>>>>>>>>>> MatSetValuesStencil(A,1,&row,num,col,v,INSERT_VALUES);CHKERRQ(ierr);
>>>>>>>>>>>>> }
>>>>>>>>>>>>> }
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> If not, just put the identity into
>>>>>>>>>>>>>>>>>>>>>>>> the rows you do not use on the full cube. It will
>>>>>>>>>>>>>>>>>>>>>>>> not hurt scalability or convergence.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> In the case of Poisson with Dirichlet condition this
>>>>>>>>>>>>>>>>>>>>>>> might be the case. But is it always true that having identity rows in the
>>>>>>>>>>>>>>>>>>>>>>> system matrix will not hurt convergence ? I thought otherwise for the
>>>>>>>>>>>>>>>>>>>>>>> following reasons:
>>>>>>>>>>>>>>>>>>>>>>> 1) Having read Jed's answer here :
>>>>>>>>>>>>>>>>>>>>>>> http://scicomp.stackexchange.com/questions/3426/why-is-pinning-a-point-to-remove-a-null-space-bad/3427#3427
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Jed is talking about a constraint on a the pressure
>>>>>>>>>>>>>>>>>>>>>> at a point. This is just decoupling these unknowns from the rest
>>>>>>>>>>>>>>>>>>>>>> of the problem.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> 2) Some observation I am getting (but I am still
>>>>>>>>>>>>>>>>>>>>>>> doing more experiments to confirm) while solving my staggered-grid 3D
>>>>>>>>>>>>>>>>>>>>>>> stokes flow with schur complement and using -pc_type gamg for A00 matrix.
>>>>>>>>>>>>>>>>>>>>>>> Putting the identity rows for dirichlet boundaries and for ghost cells
>>>>>>>>>>>>>>>>>>>>>>> seemed to have effects on its convergence. I'm hoping once I know how to
>>>>>>>>>>>>>>>>>>>>>>> use PetscSection, I can get rid of using ghost cells method for the
>>>>>>>>>>>>>>>>>>>>>>> staggered grid and get rid of the identity rows too.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> It can change the exact iteration, but it does not
>>>>>>>>>>>>>>>>>>>>>> make the matrix conditioning worse.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Anyway please provide me with some pointers so
>>>>>>>>>>>>>>>>>>>>>>> that I can start trying with petscsection on top of a dmda, in the
>>>>>>>>>>>>>>>>>>>>>>> beginning for non-staggered case.
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>> Bishesh
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Matt
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>> Bishesh
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>> What most experimenters take for granted before
>>>>>>>>>>>>>>>>>>>>>>>> they begin their experiments is infinitely more interesting than any
>>>>>>>>>>>>>>>>>>>>>>>> results to which their experiments lead.
>>>>>>>>>>>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>> What most experimenters take for granted before they
>>>>>>>>>>>>>>>>>>>>>> begin their experiments is infinitely more interesting than any results to
>>>>>>>>>>>>>>>>>>>>>> which their experiments lead.
>>>>>>>>>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>> What most experimenters take for granted before they
>>>>>>>>>>>>>>>>>>>> begin their experiments is infinitely more interesting than any results to
>>>>>>>>>>>>>>>>>>>> which their experiments lead.
>>>>>>>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>> What most experimenters take for granted before they
>>>>>>>>>>>>>>>>>> begin their experiments is infinitely more interesting than any results to
>>>>>>>>>>>>>>>>>> which their experiments lead.
>>>>>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> What most experimenters take for granted before they begin
>>>>>>>>>>>>>>>> their experiments is infinitely more interesting than any results to which
>>>>>>>>>>>>>>>> their experiments lead.
>>>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> What most experimenters take for granted before they begin
>>>>>>>>>>>>>> their experiments is infinitely more interesting than any results to which
>>>>>>>>>>>>>> their experiments lead.
>>>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> What most experimenters take for granted before they begin
>>>>>>>>>>>> their experiments is infinitely more interesting than any results to which
>>>>>>>>>>>> their experiments lead.
>>>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> What most experimenters take for granted before they begin their
>>>>>>>>>> experiments is infinitely more interesting than any results to which their
>>>>>>>>>> experiments lead.
>>>>>>>>>> -- Norbert Wiener
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> What most experimenters take for granted before they begin their
>>>>>>>> experiments is infinitely more interesting than any results to which their
>>>>>>>> experiments lead.
>>>>>>>> -- Norbert Wiener
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> What most experimenters take for granted before they begin their
>>>>>> experiments is infinitely more interesting than any results to which their
>>>>>> experiments lead.
>>>>>> -- Norbert Wiener
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> What most experimenters take for granted before they begin their
>>>> experiments is infinitely more interesting than any results to which their
>>>> experiments lead.
>>>> -- Norbert Wiener
>>>>
>>>
>>>
>>
>>
>> --
>> What most experimenters take for granted before they begin their
>> experiments is infinitely more interesting than any results to which their
>> experiments lead.
>> -- Norbert Wiener
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20131111/13d06d86/attachment-0001.html>
More information about the petsc-users
mailing list