Skip to content

Commit

Permalink
Change meaning of InsertMode argument to dFSExpandedToGlobal.
Browse files Browse the repository at this point in the history
This used to affect the way the ghost update was done, but an update with
INSERT_VALUES is ill-defined.  Now it determines how the element assembly
operator (E^T) is applied, the ghost update is only done using ADD_VALUES.
This way ADD semantics are actually useful.
  • Loading branch information
jedbrown committed May 20, 2009
1 parent b96c0de commit 8579658
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 14 deletions.
21 changes: 17 additions & 4 deletions src/fs/interface/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,10 @@ dErr dFSGlobalToExpanded(dFS fs,Vec g,Vec x,dFSHomogeneousMode hmode,InsertMode
dFunctionReturn(0);
}

/** Utility function to move from expanded -> local -> closure -> global
* @param hmode Project resulting vector into this space (only matters for rotated coords because other Dirichlet conditions are in closure)
* @param imode This refers to the expanded->local operation, it does \e not refer to the ghost update which is \e always ADD_VALUES
**/
dErr dFSExpandedToGlobal(dFS fs,Vec x,Vec g,dFSHomogeneousMode hmode,InsertMode imode)
{
dErr err;
Expand All @@ -361,11 +365,20 @@ dErr dFSExpandedToGlobal(dFS fs,Vec x,Vec g,dFSHomogeneousMode hmode,InsertMode
dValidHeader(x,VEC_COOKIE,3);
err = VecDohpGetClosure(g,&gc);dCHK(err);
err = VecGhostGetLocalForm(gc,&lf);dCHK(err);
err = dFSExpandedToLocal(fs,x,lf,INSERT_VALUES);dCHK(err);
if (imode == ADD_VALUES) { /* If we want to add, we have to kill off the ghost values otherwise they will be assembled twice */
dInt gstart,end;
dScalar *a;
err = VecGetLocalSize(gc,&gstart);dCHK(err);
err = VecGetLocalSize(lf,&end);dCHK(err);
err = VecGetArray(lf,&a);dCHK(err);
err = dMemzero(a+gstart,(end-gstart)*sizeof(*a));dCHK(err);
err = VecRestoreArray(lf,&a);dCHK(err);
} else if (imode != INSERT_VALUES) dERROR(1,"unsupported imode");
err = dFSExpandedToLocal(fs,x,lf,imode);dCHK(err);
err = VecGhostRestoreLocalForm(gc,&lf);dCHK(err);
err = VecGhostUpdateBegin(gc,imode,SCATTER_REVERSE);dCHK(err);
err = VecGhostUpdateEnd(gc,imode,SCATTER_REVERSE);dCHK(err);
if (hmode == dFS_HOMOGENEOUS) { /* \todo project into homogeneous space */ }
err = VecGhostUpdateBegin(gc,ADD_VALUES,SCATTER_REVERSE);dCHK(err);
err = VecGhostUpdateEnd(gc,ADD_VALUES,SCATTER_REVERSE);dCHK(err);
if (hmode == dFS_HOMOGENEOUS) { /* \todo project into homogeneous space (for rotated coords) */ }
err = VecDohpRestoreClosure(g,&gc);dCHK(err);
dFunctionReturn(0);
}
Expand Down
4 changes: 2 additions & 2 deletions src/fs/tests/elast.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ static dErr ElastFunction(SNES dUNUSED snes,Vec gx,Vec gy,void *ctx)
err = dFSRestoreElements(fs,&n,&off,&rule,&efs,&geomoff,&geom);dCHK(err);
err = VecRestoreArray(elt->x,&x);dCHK(err);
err = VecRestoreArray(elt->y,&y);dCHK(err);
err = dFSExpandedToGlobal(fs,elt->y,gy,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,elt->y,gy,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
dFunctionReturn(0);
}

Expand Down Expand Up @@ -361,7 +361,7 @@ static dErr ElastShellMatMult(Mat J,Vec gx,Vec gy)
err = dFSRestoreElements(fs,&n,&off,&rule,&efs,&geomoff,&geom);dCHK(err);
err = VecRestoreArray(elt->x,&x);dCHK(err);
err = VecRestoreArray(elt->y,&y);dCHK(err);
err = dFSExpandedToGlobal(fs,elt->y,gy,dFS_HOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,elt->y,gy,dFS_HOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = PetscLogEventEnd(LOG_ElastShellMult,J,gx,gy,0);dCHK(err);
dFunctionReturn(0);
}
Expand Down
4 changes: 2 additions & 2 deletions src/fs/tests/ellip.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ static dErr EllipFunction(SNES dUNUSED snes,Vec gx,Vec gy,void *ctx)
#endif
err = VecRestoreArray(elp->x,&x);dCHK(err);
err = VecRestoreArray(elp->y,&y);dCHK(err);
err = dFSExpandedToGlobal(fs,elp->y,gy,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,elp->y,gy,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
dFunctionReturn(0);
}

Expand Down Expand Up @@ -403,7 +403,7 @@ static dErr EllipShellMatMult(Mat J,Vec gx,Vec gy)
err = dFSRestoreElements(fs,&n,&off,&rule,&efs,&geomoff,&geom);dCHK(err);
err = VecRestoreArray(elp->x,&x);dCHK(err);
err = VecRestoreArray(elp->y,&y);dCHK(err);
err = dFSExpandedToGlobal(fs,elp->y,gy,dFS_HOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,elp->y,gy,dFS_HOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = PetscLogEventEnd(LOG_EllipShellMatMult,J,0,0,0);dCHK(err);
dFunctionReturn(0);
}
Expand Down
4 changes: 2 additions & 2 deletions src/fs/tests/ex1.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ static dErr useFS(dFS fs)
}
err = VecRestoreArray(x,&xx);dCHK(err);
err = VecSet(x,1.0);dCHK(err);
err = dFSExpandedToGlobal(fs,x,g,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,x,g,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = dFSGlobalToExpanded(fs,g,y,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
{
dScalar xsum,ysum,gsum;
Expand Down Expand Up @@ -288,7 +288,7 @@ static dErr ProjResidual(dUNUSED SNES snes,Vec gx,Vec gy,void *ctx)
err = dFSRestoreElements(fs,&n,&off,&rule,&efs,&geomoff,&geom);dCHK(err);
err = VecRestoreArray(proj->x,&x);dCHK(err);
err = VecRestoreArray(proj->y,&y);dCHK(err);
err = dFSExpandedToGlobal(fs,proj->y,gy,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fs,proj->y,gy,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
dFunctionReturn(0);
}

Expand Down
8 changes: 4 additions & 4 deletions src/fs/tests/stokes.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,8 +366,8 @@ static dErr StokesFunction(SNES dUNUSED snes,Vec gx,Vec gy,void *ctx)
{
err = VecZeroEntries(gxu);dCHK(err);
err = VecZeroEntries(gxp);dCHK(err);
err = dFSExpandedToGlobal(fsu,stk->yu,gxu,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsp,stk->yp,gxp,dFS_INHOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsu,stk->yu,gxu,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsp,stk->yp,gxp,dFS_INHOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = VecScatterBegin(stk->extractVelocity,gxu,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
err = VecScatterEnd (stk->extractVelocity,gxu,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
err = VecScatterBegin(stk->extractPressure,gxp,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
Expand Down Expand Up @@ -441,8 +441,8 @@ static dErr StokesShellMatMult_J(Mat J,Vec gx,Vec gy)
{
err = VecZeroEntries(gxu);dCHK(err);
err = VecZeroEntries(gxp);dCHK(err);
err = dFSExpandedToGlobal(fsu,stk->yu,gxu,dFS_HOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsp,stk->yp,gxp,dFS_HOMOGENEOUS,ADD_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsu,stk->yu,gxu,dFS_HOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = dFSExpandedToGlobal(fsp,stk->yp,gxp,dFS_HOMOGENEOUS,INSERT_VALUES);dCHK(err);
err = VecScatterBegin(stk->extractVelocity,gxu,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
err = VecScatterEnd (stk->extractVelocity,gxu,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
err = VecScatterBegin(stk->extractPressure,gxp,gy,INSERT_VALUES,SCATTER_REVERSE);dCHK(err);
Expand Down

0 comments on commit 8579658

Please sign in to comment.