Sorry, If I call this AddBoundary Twice with different markers/ids, the bcFunc seems to be applied to set values for DM_BC_ESSENTIAL not DM_BC_NATURAL?
Can I call ierr = PetscDSSetBdResidual(prob, 0, f0_bd_u, f1_bd_zero) twice to set the f0 functions different for each boundary ? /*@C PetscDSAddBoundary - Add a boundary condition to the model Input Parameters: + ds - The PetscDS object . type - The type of condition, e.g. DM_BC_ESSENTIAL/DM_BC_ESSENTIAL_FIELD (Dirichlet), or DM_BC_NATURAL (Neumann) . name - The BC name . labelname - The label defining constrained points . field - The field to constrain . numcomps - The number of constrained field components . comps - An array of constrained component numbers . bcFunc - A pointwise function giving boundary values . numids - The number of DMLabel ids for constrained points . ids - An array of ids for constrained points - ctx - An optional user context for bcFunc Options Database Keys: + -bc_<boundary name> <num> - Overrides the boundary ids - -bc_<boundary name>_comp <num> - Overrides the boundary components Level: developer .seealso: PetscDSGetBoundary() @*/ On Mon, Nov 20, 2017 at 11:33 AM, David Fuentes <[email protected]> wrote: > Thanks! will give that a try! > df > > On Mon, Nov 20, 2017 at 11:23 AM, Matthew Knepley <[email protected]> > wrote: > >> On Mon, Nov 20, 2017 at 12:20 PM, David Fuentes <[email protected]> >> wrote: >> >>> Thanks for the quick reply. Indeed it does work like this. I have added >>> a location dependence on the boundary to differentiate the two. However, >>> when my mesh moves then the BC will be applied incorrectly. >>> >> >> I don't think you should have to do that. You can call AddBoundary twice. >> Once with a function with the first branch and marker value 3, and the next >> with the second branch and marker value 2. Does >> that make sense? >> >> Thanks, >> >> Matt >> >>> *// PetscFEIntegrateBdResidual_Basic DMPlexComputeBdResidual_Internal* >>> >>> *static* *void** f0_bd_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,* >>> >>> *const** PetscInt uOff[], **const** PetscInt >>> uOff_x[], **const** PetscScalar u[], **const** PetscScalar u_t[], * >>> *const** PetscScalar u_x[],* >>> >>> *const** PetscInt aOff[], **const** PetscInt >>> aOff_x[], **const** PetscScalar a[], **const** PetscScalar a_t[], * >>> *const** PetscScalar a_x[],* >>> >>> * PetscReal t, **const** PetscReal x[], **const** >>> PetscReal n[], PetscInt numConstants, **const** PetscScalar >>> constants[], PetscScalar f0[])* >>> >>> *{ * >>> >>> * PetscInt d;* >>> >>> *double** radius = **0.0**;* >>> >>> *const* *double** zthresh = (**3.** - **4.5**/**2.**)***.01**; **// >>> [m]* >>> >>> *for** (d = **0**; d < **2**; ++d) radius += x[d]*x[d];* >>> >>> * radius = sqrt(radius); * >>> >>> *if** ( radius > **.001**/**2.** ) * >>> >>> * {f0[**0**] = constants[**2**] * u[**0**];}* >>> >>> *else* >>> >>> * {* >>> >>> * f0[**0**] = -constants[**3**] ; * >>> >>> * }* >>> >>> *} * >>> >>> >>> On Mon, Nov 20, 2017 at 11:02 AM, Matthew Knepley <[email protected]> >>> wrote: >>> >>>> On Mon, Nov 20, 2017 at 11:46 AM, David Fuentes <[email protected]> >>>> wrote: >>>> >>>>> *Is there a way to pass the boundary set id to the function pointers >>>>> for the residual evaluation on the boundary ?* >>>>> >>>>> *https://bitbucket.org/petsc/petsc/src/d89bd21cf2b5366df29efb6006298d2bc22fb509/src/dm/dt/interface/dtfe.c?at=master&fileviewer=file-view-default#dtfe.c-4245 >>>>> <https://bitbucket.org/petsc/petsc/src/d89bd21cf2b5366df29efb6006298d2bc22fb509/src/dm/dt/interface/dtfe.c?at=master&fileviewer=file-view-default#dtfe.c-4245>* >>>>> >>>>> *I want to pass the boundary condition/constraint ID (ids): >>>>> PetscErrorCode PetscDSAddBoundary(PetscDS ds, DMBoundaryConditionType >>>>> type, >>>>> const char name[], const char labelname[], PetscInt field, PetscInt >>>>> numcomps, const PetscInt *comps, void (*bcFunc)(void), PetscInt numids, >>>>> const PetscInt *ids, void *ctx)* >>>>> >>>>> *to the functions for the residual evaluation on the boundary.* >>>>> >>>>> >>>>> *For example, I have two side sets in an exodus file. I want to >>>>> implement Neumann boundary conditions on side set = 2 and Mixed/Cauchy BC >>>>> on side set = 3. Or similarly use different* >>>>> >>>>> *gmsh BC tags for Neumann/Mixed BC.* >>>>> >>>> I am not completely against this, but let me respond with my rationale >>>> first. What I thought you would do, is call AddBoundary() twice. Once with >>>> the >>>> Neumann function and value 2, and once with the Cauchy function and >>>> value 3. Does that not work in your situation? >>>> >>>> Also, I am refectoring this right now because a DS object can only take >>>> a single boundary integral point function (which is a pain for >>>> inhomogeneous Neumann), >>>> so I welcome input. >>>> >>>> Thanks, >>>> >>>> Matt >>>> >>>> -- >>>> 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 >>>> >>>> https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/~mk51/> >>>> >>> >>> >> >> >> -- >> 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 >> >> https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/~mk51/> >> > >
