本文整理汇总了C++中DMGetCoordinateDM函数的典型用法代码示例。如果您正苦于以下问题:C++ DMGetCoordinateDM函数的具体用法?C++ DMGetCoordinateDM怎么用?C++ DMGetCoordinateDM使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DMGetCoordinateDM函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DMView_DA_VTK
PetscErrorCode DMView_DA_VTK(DM da, PetscViewer viewer)
{
PetscInt dim, dof, M = 0, N = 0, P = 0;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = DMDAGetInfo(da, &dim, &M, &N, &P, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL);CHKERRQ(ierr);
if (!da->coordinates) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP, "VTK output requires DMDA coordinates.");
/* Write Header */
ierr = PetscViewerASCIIPrintf(viewer,"# vtk DataFile Version 2.0\n");CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"Structured Mesh Example\n");CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"ASCII\n");CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"DATASET STRUCTURED_GRID\n");CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"DIMENSIONS %d %d %d\n", M, N, P);CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"POINTS %d double\n", M*N*P);CHKERRQ(ierr);
if (da->coordinates) {
DM dac;
Vec natural;
ierr = DMGetCoordinateDM(da, &dac);CHKERRQ(ierr);
ierr = DMDACreateNaturalVector(dac, &natural);CHKERRQ(ierr);
ierr = PetscObjectSetOptionsPrefix((PetscObject) natural, "coor_");CHKERRQ(ierr);
ierr = DMDAGlobalToNaturalBegin(dac, da->coordinates, INSERT_VALUES, natural);CHKERRQ(ierr);
ierr = DMDAGlobalToNaturalEnd(dac, da->coordinates, INSERT_VALUES, natural);CHKERRQ(ierr);
ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_ASCII_VTK_COORDS);CHKERRQ(ierr);
ierr = VecView(natural, viewer);CHKERRQ(ierr);
ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
ierr = VecDestroy(&natural);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例2: FormPsiAndInitialGuess
PetscErrorCode FormPsiAndInitialGuess(DM da,Vec U0,PetscBool feasible)
{
ObsCtx *user;
PetscErrorCode ierr;
PetscInt i,j,Mx,My,xs,ys,xm,ym;
DM coordDA;
Vec coordinates;
DMDACoor2d **coords;
PetscReal **psi, **u0, **uexact,
x, y, r,
afree = 0.69797, A = 0.68026, B = 0.47152, pi = 3.1415926;
PetscFunctionBeginUser;
ierr = DMGetApplicationContext(da,&user);CHKERRQ(ierr);
ierr = DMDAGetInfo(da,PETSC_IGNORE,&Mx,&My,PETSC_IGNORE,PETSC_IGNORE,
PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,
PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE);
ierr = DMDAGetCorners(da,&xs,&ys,PETSC_NULL,&xm,&ym,PETSC_NULL);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da, &coordDA);CHKERRQ(ierr);
ierr = DMGetCoordinates(da, &coordinates);CHKERRQ(ierr);
ierr = DMDAVecGetArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, user->psi, &psi);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, U0, &u0);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, user->uexact, &uexact);CHKERRQ(ierr);
for (j=ys; j<ys+ym; j++) {
for (i=xs; i<xs+xm; i++) {
x = coords[j][i].x;
y = coords[j][i].y;
r = sqrt(x * x + y * y);
if (r <= 1.0) {
psi[j][i] = sqrt(1.0 - r * r);
} else {
psi[j][i] = -1.0;
}
if (r <= afree) {
uexact[j][i] = psi[j][i]; /* on the obstacle */
} else {
uexact[j][i] = - A * log(r) + B; /* solves the laplace eqn */
}
if (feasible) {
if (i == 0 || j == 0 || i == Mx-1 || j == My-1) {
u0[j][i] = uexact[j][i];
} else {
/* initial guess is admissible: it is above the obstacle */
u0[j][i] = uexact[j][i] + cos(pi * x / 4) * cos(pi * y / 4);
}
} else {
u0[j][i] = 0.;
}
}
}
ierr = DMDAVecRestoreArray(da, user->psi, &psi);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(da, U0, &u0);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(da, user->uexact, &uexact);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例3: FormCoordinates
PetscErrorCode FormCoordinates(DM da,AppCtx *user)
{
PetscErrorCode ierr;
Vec coords;
DM cda;
PetscInt mx,my,mz;
PetscInt i,j,k,xs,ys,zs,xm,ym,zm;
CoordField ***x;
PetscFunctionBegin;
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMCreateGlobalVector(cda,&coords);CHKERRQ(ierr);
ierr = DMDAGetInfo(da,0,&mx,&my,&mz,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr);
ierr = DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da,coords,&x);CHKERRQ(ierr);
for (k=zs; k<zs+zm; k++) {
for (j=ys; j<ys+ym; j++) {
for (i=xs; i<xs+xm; i++) {
PetscReal cx = ((PetscReal)i) / (((PetscReal)(mx-1)));
PetscReal cy = ((PetscReal)j) / (((PetscReal)(my-1)));
PetscReal cz = ((PetscReal)k) / (((PetscReal)(mz-1)));
PetscReal rad = user->rad + cy*user->height;
PetscReal ang = (cx - 0.5)*user->arc;
x[k][j][i][0] = rad*PetscSinReal(ang);
x[k][j][i][1] = rad*PetscCosReal(ang) - (user->rad + 0.5*user->height)*PetscCosReal(-0.5*user->arc);
x[k][j][i][2] = user->width*(cz - 0.5);
}
}
}
ierr = DMDAVecRestoreArray(da,coords,&x);CHKERRQ(ierr);
ierr = DMSetCoordinates(da,coords);CHKERRQ(ierr);
ierr = VecDestroy(&coords);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例4: DMDAComputeCellGeometryFEM
PetscErrorCode DMDAComputeCellGeometryFEM(DM dm, PetscInt cell, PetscQuadrature quad, PetscReal v0[], PetscReal J[], PetscReal invJ[], PetscReal detJ[])
{
DM cdm;
Vec coordinates;
const PetscReal *quadPoints;
PetscScalar *vertices = NULL;
PetscInt numQuadPoints, csize, dim, d, q;
PetscErrorCode ierr;
PetscFunctionBegin;
PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
ierr = DMDAGetInfo(dm, &dim, 0,0,0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(dm, &cdm);CHKERRQ(ierr);
ierr = DMDAVecGetClosure(cdm, NULL, coordinates, cell, &csize, &vertices);CHKERRQ(ierr);
for (d = 0; d < dim; ++d) v0[d] = PetscRealPart(vertices[d]);
switch (dim) {
case 2:
ierr = PetscQuadratureGetData(quad, NULL, &numQuadPoints, &quadPoints, NULL);CHKERRQ(ierr);
for (q = 0; q < numQuadPoints; ++q) {
ierr = DMDAComputeCellGeometry_2D(dm, vertices, &quadPoints[q*dim], J, invJ, detJ);CHKERRQ(ierr);
}
break;
default:
SETERRQ1(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "Dimension %d not supported", dim);
}
ierr = DMDAVecRestoreClosure(cdm, NULL, coordinates, cell, &csize, &vertices);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例5: SetCoordinates3d
PetscErrorCode SetCoordinates3d(DM da)
{
PetscErrorCode ierr;
PetscInt i,j,mstart,m,nstart,n,pstart,p,k;
Vec gc,global;
DMDACoor3d ***coors;
DM cda;
PetscFunctionBeginUser;
ierr = DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(da,&gc);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAGetCorners(cda,&mstart,&nstart,&pstart,&m,&n,&p);CHKERRQ(ierr);
for (i=mstart; i<mstart+m; i++) {
for (j=nstart; j<nstart+n; j++) {
for (k=pstart; k<pstart+p; k++) {
if (i % 2) {
coors[k][j][i].x = coors[k][j][i-1].x + .1*(coors[k][j][i+1].x - coors[k][j][i-1].x);
}
if (j % 2) {
coors[k][j][i].y = coors[k][j-1][i].y + .3*(coors[k][j+1][i].y - coors[k][j-1][i].y);
}
if (k % 2) {
coors[k][j][i].z = coors[k-1][j][i].z + .4*(coors[k+1][j][i].z - coors[k-1][j][i].z);
}
}
}
}
ierr = DMDAVecRestoreArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMGetCoordinates(da,&global);CHKERRQ(ierr);
ierr = DMLocalToGlobalBegin(cda,gc,INSERT_VALUES,global);CHKERRQ(ierr);
ierr = DMLocalToGlobalEnd(cda,gc,INSERT_VALUES,global);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例6: SetCoordinates1d
PetscErrorCode SetCoordinates1d(DM da)
{
PetscErrorCode ierr;
PetscInt i,start,m;
Vec gc,global;
PetscScalar *coors;
DM cda;
PetscFunctionBeginUser;
ierr = DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(da,&gc);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAGetCorners(cda,&start,0,0,&m,0,0);CHKERRQ(ierr);
for (i=start; i<start+m; i++) {
if (i % 2) {
coors[i] = coors[i-1] + .1*(coors[i+1] - coors[i-1]);
}
}
ierr = DMDAVecRestoreArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMGetCoordinates(da,&global);CHKERRQ(ierr);
ierr = DMLocalToGlobalBegin(cda,gc,INSERT_VALUES,global);CHKERRQ(ierr);
ierr = DMLocalToGlobalEnd(cda,gc,INSERT_VALUES,global);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例7: DADefineXLinearField2D
PetscErrorCode DADefineXLinearField2D(DM da,Vec field)
{
PetscErrorCode ierr;
PetscInt i,j;
PetscInt sx,nx,sy,ny;
Vec Gcoords;
DMDACoor2d **XX;
PetscScalar **FF;
DM cda;
PetscFunctionBeginUser;
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinates(da,&Gcoords);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,Gcoords,&XX);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da,field,&FF);CHKERRQ(ierr);
ierr = DMDAGetCorners(da,&sx,&sy,0,&nx,&ny,0);CHKERRQ(ierr);
for (i=sx; i<sx+nx; i++) {
for (j=sy; j<sy+ny; j++ ) {
FF[j][i] = 10.0 + 3.0 * XX[j][i].x + 5.5 * XX[j][i].y + 8.003 * XX[j][i].x * XX[j][i].y;
}
}
ierr = DMDAVecRestoreArray(da,field,&FF);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(cda,Gcoords,&XX);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例8: ini_bou
PetscErrorCode ini_bou(Vec X,AppCtx* user)
{
PetscErrorCode ierr;
DM cda;
DMDACoor2d **coors;
PetscScalar **p;
Vec gc;
PetscInt M,N,I,J;
PetscMPIInt rank;
PetscFunctionBeginUser;
ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
ierr = DMDAGetInfo(user->da,NULL,&M,&N,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
user->dx = (user->xmax - user->xmin)/(M-1); user->dy = (user->ymax - user->ymin)/(N-1);
ierr = DMGetCoordinateDM(user->da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinates(user->da,&gc);CHKERRQ(ierr);
ierr = DMDAVecGetArrayRead(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAVecGetArray(user->da,X,&p);CHKERRQ(ierr);
/* Point mass at (mux,muy) */
ierr = PetscPrintf(PETSC_COMM_WORLD,"Original user->mux = %f, user->muy = %f\n",user->mux,user->muy);CHKERRQ(ierr);
ierr = DMDAGetLogicalCoordinate(user->da,user->mux,user->muy,0.0,&I,&J,NULL,&user->mux,&user->muy,NULL);CHKERRQ(ierr);
user->PM_min = user->Pmax*PetscSinScalar(user->mux);
ierr = PetscPrintf(PETSC_COMM_WORLD,"Corrected user->mux = %f, user->muy = %f user->PM_min = %f,user->dx = %f\n",user->mux,user->muy,user->PM_min,user->dx);CHKERRQ(ierr);
if (I > -1 && J > -1) {
p[J][I] = 1.0;
}
ierr = DMDAVecRestoreArrayRead(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(user->da,X,&p);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例9: SetCoordinates2d
PetscErrorCode SetCoordinates2d(DM da)
{
PetscErrorCode ierr;
PetscInt i,j,mstart,m,nstart,n;
Vec local,global;
DMDACoor2d **coors,**coorslocal;
DM cda;
PetscFunctionBeginUser;
ierr = DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinates(da,&global);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(da,&local);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,global,&coors);CHKERRQ(ierr);
ierr = DMDAVecGetArrayRead(cda,local,&coorslocal);CHKERRQ(ierr);
ierr = DMDAGetCorners(cda,&mstart,&nstart,0,&m,&n,0);CHKERRQ(ierr);
for (i=mstart; i<mstart+m; i++) {
for (j=nstart; j<nstart+n; j++) {
if (i % 2) {
coors[j][i].x = coorslocal[j][i-1].x + .1*(coorslocal[j][i+1].x - coorslocal[j][i-1].x);
}
if (j % 2) {
coors[j][i].y = coorslocal[j-1][i].y + .3*(coorslocal[j+1][i].y - coorslocal[j-1][i].y);
}
}
}
ierr = DMDAVecRestoreArray(cda,global,&coors);CHKERRQ(ierr);
ierr = DMDAVecRestoreArrayRead(cda,local,&coorslocal);CHKERRQ(ierr);
ierr = DMGlobalToLocalBegin(cda,global,INSERT_VALUES,local);CHKERRQ(ierr);
ierr = DMGlobalToLocalEnd(cda,global,INSERT_VALUES,local);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例10: FormExactSolution2
/*
FormExactSolution2 - Forms initial approximation.
Input Parameters:
da - The DM
user - user-defined application context
Output Parameter:
X - vector
*/
PetscErrorCode FormExactSolution2(DM da, AppCtx *user, Vec U)
{
DM coordDA;
Vec coordinates;
DMDACoor2d **coords;
PetscScalar **u;
PetscReal x, y;
PetscInt xs, ys, xm, ym, i, j;
PetscErrorCode ierr;
PetscFunctionBeginUser;
ierr = DMDAGetCorners(da, &xs, &ys, NULL, &xm, &ym, NULL);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da, &coordDA);CHKERRQ(ierr);
ierr = DMGetCoordinates(da, &coordinates);CHKERRQ(ierr);
ierr = DMDAVecGetArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, U, &u);CHKERRQ(ierr);
for (j = ys; j < ys+ym; ++j) {
for (i = xs; i < xs+xm; ++i) {
x = PetscRealPart(coords[j][i].x);
y = PetscRealPart(coords[j][i].y);
u[j][i] = PetscSinReal(PETSC_PI*x)*PetscSinReal(PETSC_PI*y);
}
}
ierr = DMDAVecRestoreArray(da, U, &u);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例11: FormPsiAndExactSoln
PetscErrorCode FormPsiAndExactSoln(DM da) {
ObsCtx *user;
PetscErrorCode ierr;
DMDALocalInfo info;
PetscInt i,j;
DM coordDA;
Vec coordinates;
DMDACoor2d **coords;
PetscReal **psi, **uexact, r;
const PetscReal afree = 0.69797, A = 0.68026, B = 0.47152;
PetscFunctionBeginUser;
ierr = DMGetApplicationContext(da,&user);CHKERRQ(ierr);
ierr = DMDAGetLocalInfo(da,&info); CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da, &coordDA);CHKERRQ(ierr);
ierr = DMGetCoordinates(da, &coordinates);CHKERRQ(ierr);
ierr = DMDAVecGetArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, user->psi, &psi);CHKERRQ(ierr);
ierr = DMDAVecGetArray(da, user->uexact, &uexact);CHKERRQ(ierr);
for (j=info.ys; j<info.ys+info.ym; j++) {
for (i=info.xs; i<info.xs+info.xm; i++) {
r = PetscSqrtReal(pow(coords[j][i].x,2) + pow(coords[j][i].y,2));
if (r <= 1.0) psi[j][i] = PetscSqrtReal(1.0 - r * r);
else psi[j][i] = -1.0;
if (r <= afree) uexact[j][i] = psi[j][i]; /* on the obstacle */
else uexact[j][i] = - A * PetscLogReal(r) + B; /* solves the laplace eqn */
}
}
ierr = DMDAVecRestoreArray(da, user->psi, &psi);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(da, user->uexact, &uexact);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(coordDA, coordinates, &coords);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例12: OpForcing
PetscErrorCode OpForcing(Op op,DM dm,Vec F) {
PetscErrorCode ierr;
Vec X,Floc;
DM dmx;
const PetscScalar *x;
PetscScalar *f;
const PetscReal *B,*D,*w3;
PetscReal L[3];
PetscInt nelem,ne = op->ne,P,Q,P3,Q3;
PetscFunctionBegin;
ierr = PetscLogEventBegin(OP_Forcing,dm,F,0,0);CHKERRQ(ierr);
ierr = DMFEGetTensorEval(dm,&P,&Q,&B,&D,NULL,NULL,&w3);CHKERRQ(ierr);
P3 = P*P*P;
Q3 = Q*Q*Q;
ierr = DMFEGetUniformCoordinates(dm,L);CHKERRQ(ierr);
ierr = DMGetLocalVector(dm,&Floc);CHKERRQ(ierr);
ierr = DMGetCoordinateDM(dm,&dmx);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(dm,&X);CHKERRQ(ierr);
ierr = DMFEGetNumElements(dm,&nelem);CHKERRQ(ierr);
ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
ierr = VecZeroEntries(Floc);CHKERRQ(ierr);
ierr = VecGetArray(Floc,&f);CHKERRQ(ierr);
for (PetscInt e=0; e<nelem; e+=ne) {
PetscScalar fe[op->dof*P3*ne]_align,fq[op->dof][Q3][ne]_align,xe[3*P3*ne]_align,xq[3][Q3][ne]_align,dx[3][3][Q3][ne]_align,wdxdet[Q3][ne]_align;
ierr = DMFEExtractElements(dmx,x,e,ne,xe);CHKERRQ(ierr);
ierr = PetscMemzero(xq,sizeof xq);CHKERRQ(ierr);
ierr = TensorContract(op->Tensor3,B,B,B,TENSOR_EVAL,xe,xq[0][0]);CHKERRQ(ierr);
ierr = PetscMemzero(dx,sizeof dx);CHKERRQ(ierr);
ierr = TensorContract(op->Tensor3,D,B,B,TENSOR_EVAL,xe,dx[0][0][0]);CHKERRQ(ierr);
ierr = TensorContract(op->Tensor3,B,D,B,TENSOR_EVAL,xe,dx[1][0][0]);CHKERRQ(ierr);
ierr = TensorContract(op->Tensor3,B,B,D,TENSOR_EVAL,xe,dx[2][0][0]);CHKERRQ(ierr);
ierr = PointwiseJacobianInvert(ne,Q*Q*Q,w3,dx,wdxdet);CHKERRQ(ierr);
for (PetscInt i=0; i<Q3; i++) {
for (PetscInt l=0; l<ne; l++) {
PetscReal xx[] = {xq[0][i][l],xq[1][i][l],xq[2][i][l]};
PetscScalar fql[op->dof];
ierr = (op->PointwiseForcing)(op,xx,L,fql);CHKERRQ(ierr);
for (PetscInt d=0; d<op->dof; d++) fq[d][i][l] = wdxdet[i][l] * fql[d];
}
}
ierr = PetscMemzero(fe,sizeof fe);CHKERRQ(ierr);
ierr = TensorContract(op->TensorDOF,B,B,B,TENSOR_TRANSPOSE,fq[0][0],fe);CHKERRQ(ierr);
ierr = DMFESetElements(dm,f,e,ne,ADD_VALUES,DOMAIN_INTERIOR,fe);CHKERRQ(ierr);
}
ierr = VecRestoreArrayRead(X,&x);CHKERRQ(ierr);
ierr = VecRestoreArray(Floc,&f);CHKERRQ(ierr);
ierr = VecZeroEntries(F);CHKERRQ(ierr);
ierr = DMLocalToGlobalBegin(dm,Floc,ADD_VALUES,F);CHKERRQ(ierr);
ierr = DMLocalToGlobalEnd(dm,Floc,ADD_VALUES,F);CHKERRQ(ierr);
ierr = DMRestoreLocalVector(dm,&Floc);CHKERRQ(ierr);
ierr = PetscLogEventEnd(OP_Forcing,dm,F,0,0);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例13: ini_bou
PetscErrorCode ini_bou(Vec X,AppCtx* user)
{
PetscErrorCode ierr;
DM cda;
DMDACoor2d **coors;
PetscScalar **p;
Vec gc;
PetscInt i,j;
PetscInt xs,ys,xm,ym,M,N;
PetscScalar xi,yi;
PetscScalar sigmax=user->sigmax,sigmay=user->sigmay;
PetscScalar rho =user->rho;
PetscScalar mux =user->mux,muy=user->muy;
PetscMPIInt rank;
PetscScalar sum;
PetscFunctionBeginUser;
ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
ierr = DMDAGetInfo(user->da,NULL,&M,&N,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
user->dx = (user->xmax - user->xmin)/(M-1); user->dy = (user->ymax - user->ymin)/(N-1);
ierr = DMGetCoordinateDM(user->da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinates(user->da,&gc);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAVecGetArray(user->da,X,&p);CHKERRQ(ierr);
ierr = DMDAGetCorners(cda,&xs,&ys,0,&xm,&ym,0);CHKERRQ(ierr);
/* mux and muy need to be grid points in the x and y-direction otherwise the solution goes unstable
muy is set by choosing the y domain, no. of grid points along y-direction so that muy is a grid point
in the y-direction. We only modify mux here
*/
mux = user->mux = coors[0][M/2+10].x; /* For -pi < x < pi, this should be some angle between 0 and pi/2 */
if (user->nonoiseinitial) {
for (i=xs; i < xs+xm; i++) {
for (j=ys; j < ys+ym; j++) {
xi = coors[j][i].x; yi = coors[j][i].y;
if ((xi == mux) && (yi == muy)) {
p[j][i] = 1.0;
}
}
}
} else {
/* Change PM_min accordingly */
user->PM_min = user->Pmax*sin(mux);
for (i=xs; i < xs+xm; i++) {
for (j=ys; j < ys+ym; j++) {
xi = coors[j][i].x; yi = coors[j][i].y;
p[j][i] = (0.5/(PETSC_PI*sigmax*sigmay*PetscSqrtScalar(1.0-rho*rho)))*PetscExpScalar(-0.5/(1-rho*rho)*(PetscPowScalar((xi-mux)/sigmax,2) + PetscPowScalar((yi-muy)/sigmay,2) - 2*rho*(xi-mux)*(yi-muy)/(sigmax*sigmay)));
}
}
}
ierr = DMDAVecRestoreArray(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(user->da,X,&p);CHKERRQ(ierr);
ierr = VecSum(X,&sum);CHKERRQ(ierr);
ierr = VecScale(X,1.0/sum);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例14: DAApplyTrilinearMapping
PetscErrorCode DAApplyTrilinearMapping(DM da)
{
PetscErrorCode ierr;
PetscInt i,j,k;
PetscInt sx,nx,sy,ny,sz,nz;
Vec Gcoords;
DMDACoor3d ***XX;
PetscScalar xx,yy,zz;
DM cda;
PetscFunctionBeginUser;
ierr = DMDASetUniformCoordinates(da, -1.0,1.0, -1.0,1.0, -1.0,1.0 );CHKERRQ(ierr);
ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr);
ierr = DMGetCoordinates(da,&Gcoords);CHKERRQ(ierr);
ierr = DMDAVecGetArray(cda,Gcoords,&XX);CHKERRQ(ierr);
ierr = DMDAGetCorners(da,&sx,&sy,&sz,&nx,&ny,&nz);CHKERRQ(ierr);
for (i=sx; i<sx+nx; i++) {
for (j=sy; j<sy+ny; j++ ) {
for (k=sz; k<sz+nz; k++ ) {
PetscScalar Ni[8];
PetscScalar xi = XX[k][j][i].x;
PetscScalar eta = XX[k][j][i].y;
PetscScalar zeta = XX[k][j][i].z;
PetscScalar xn[] = {0.0,2.0,0.2,3.5, 0.0,2.1,0.23,3.125 };
PetscScalar yn[] = {-1.3,0.0,2.0,4.0, -1.45,-0.1,2.24,3.79 };
PetscScalar zn[] = {0.0,0.3,-0.1,0.123, 0.956,1.32,1.12,0.798 };
PetscInt p;
Ni[0] = 0.125*(1.0-xi)*(1.0-eta)*(1.0-zeta);
Ni[1] = 0.125*(1.0+xi)*(1.0-eta)*(1.0-zeta);
Ni[2] = 0.125*(1.0-xi)*(1.0+eta)*(1.0-zeta);
Ni[3] = 0.125*(1.0+xi)*(1.0+eta)*(1.0-zeta);
Ni[4] = 0.125*(1.0-xi)*(1.0-eta)*(1.0+zeta);
Ni[5] = 0.125*(1.0+xi)*(1.0-eta)*(1.0+zeta);
Ni[6] = 0.125*(1.0-xi)*(1.0+eta)*(1.0+zeta);
Ni[7] = 0.125*(1.0+xi)*(1.0+eta)*(1.0+zeta);
xx = yy = zz = 0.0;
for (p=0; p<8; p++ ) {
xx += Ni[p]*xn[p];
yy += Ni[p]*yn[p];
zz += Ni[p]*zn[p];
}
XX[k][j][i].x = xx;
XX[k][j][i].y = yy;
XX[k][j][i].z = zz;
}
}
}
ierr = DMDAVecRestoreArray(cda,Gcoords,&XX);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例15: IFunction
PetscErrorCode IFunction(TS ts,PetscReal t,Vec X,Vec Xdot,Vec F,void *ctx)
{
PetscErrorCode ierr;
AppCtx *user=(AppCtx*)ctx;
DM cda;
DMDACoor2d **coors;
PetscScalar **p,**f,**pdot;
PetscInt i,j;
PetscInt xs,ys,xm,ym,M,N;
Vec localX,gc,localXdot;
PetscScalar p_adv1,p_adv2,p_diff;
PetscFunctionBeginUser;
ierr = DMDAGetInfo(user->da,NULL,&M,&N,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ierr = DMGetCoordinateDM(user->da,&cda);CHKERRQ(ierr);
ierr = DMDAGetCorners(cda,&xs,&ys,0,&xm,&ym,0);CHKERRQ(ierr);
ierr = DMGetLocalVector(user->da,&localX);CHKERRQ(ierr);
ierr = DMGetLocalVector(user->da,&localXdot);CHKERRQ(ierr);
ierr = DMGlobalToLocalBegin(user->da,X,INSERT_VALUES,localX);CHKERRQ(ierr);
ierr = DMGlobalToLocalEnd(user->da,X,INSERT_VALUES,localX);CHKERRQ(ierr);
ierr = DMGlobalToLocalBegin(user->da,Xdot,INSERT_VALUES,localXdot);CHKERRQ(ierr);
ierr = DMGlobalToLocalEnd(user->da,Xdot,INSERT_VALUES,localXdot);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(user->da,&gc);CHKERRQ(ierr);
ierr = DMDAVecGetArrayRead(cda,gc,&coors);CHKERRQ(ierr);
ierr = DMDAVecGetArrayRead(user->da,localX,&p);CHKERRQ(ierr);
ierr = DMDAVecGetArrayRead(user->da,localXdot,&pdot);CHKERRQ(ierr);
ierr = DMDAVecGetArray(user->da,F,&f);CHKERRQ(ierr);
PetscScalar diffuse1,gamma;
gamma = user->D*user->ws/(2*user->H);
diffuse1 = user->lambda*user->lambda*user->q/(user->lambda*gamma+1)*(1.0 - PetscExpScalar(-t*(gamma+1.0)/user->lambda));
user->disper_coe = user->ws*user->ws/(4*user->H*user->H)*diffuse1;
for (i=xs; i < xs+xm; i++) {
for (j=ys; j < ys+ym; j++) {
ierr = adv1(p,coors[j][i].y,i,j,M,&p_adv1,user);CHKERRQ(ierr);
ierr = adv2(p,coors[j][i].x,coors[j][i].y,i,j,N,&p_adv2,user);CHKERRQ(ierr);
ierr = diffuse(p,i,j,t,&p_diff,user);CHKERRQ(ierr);
f[j][i] = -p_adv1 - p_adv2 + p_diff - pdot[j][i];
}
}
ierr = DMDAVecRestoreArrayRead(user->da,localX,&p);CHKERRQ(ierr);
ierr = DMDAVecRestoreArrayRead(user->da,localX,&pdot);CHKERRQ(ierr);
ierr = DMRestoreLocalVector(user->da,&localX);CHKERRQ(ierr);
ierr = DMRestoreLocalVector(user->da,&localXdot);CHKERRQ(ierr);
ierr = DMDAVecRestoreArray(user->da,F,&f);CHKERRQ(ierr);
ierr = DMDAVecRestoreArrayRead(cda,gc,&coors);CHKERRQ(ierr);
PetscFunctionReturn(0);
}