18 PetscFunctionBeginUser;
21 char drivenDirection =
' ';
22 for (
int i = 0; i < 6; i++) {
37 if (drivenDirection ==
' ') {
38 PetscFunctionReturn(0);
43 if (PetscAbsReal(bulkVelocityCorrection) < 1.0e-12) {
44 PetscFunctionReturn(0);
48 simCtx->
rank, user->
_this, drivenDirection);
52 DMDALocalInfo info = user->
info;
54 PetscInt lxs = (info.xs == 0) ? 1 : info.xs;
55 PetscInt lys = (info.ys == 0) ? 1 : info.ys;
56 PetscInt lzs = (info.zs == 0) ? 1 : info.zs;
57 PetscInt lxe = (info.xs + info.xm == info.mx) ? info.mx - 1 : info.xs + info.xm;
58 PetscInt lye = (info.ys + info.ym == info.my) ? info.my - 1 : info.ys + info.ym;
59 PetscInt lze = (info.zs + info.zm == info.mz) ? info.mz - 1 : info.zs + info.zm;
61 Cmpnts ***rct, ***csi, ***eta, ***zet;
63 ierr = DMDAVecGetArray(user->
fda, Rct, &rct); CHKERRQ(ierr);
64 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
65 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
66 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
67 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
72 PetscReal drivingForceMagnitude = (bulkVelocityCorrection / simCtx->
dt / 1.0 *
COEF_TIME_ACCURACY);
79 PetscBool hasLoggedApplication = PETSC_FALSE;
81 for (k = lzs; k < lze; k++) {
82 for (j = lys; j < lye; j++) {
83 for (i = lxs; i < lxe; i++) {
84 if (nvert[k][j][i] < 0.1) {
85 PetscReal faceArea = 0.0;
86 PetscReal momentumSource = 0.0;
88 switch (drivenDirection) {
90 faceArea = sqrt(csi[k][j][i].x * csi[k][j][i].x + csi[k][j][i].y * csi[k][j][i].y + csi[k][j][i].z * csi[k][j][i].z);
91 momentumSource = drivingForceMagnitude * forceScalingFactor * faceArea;
92 rct[k][j][i].
x += momentumSource;
95 if (!hasLoggedApplication) {
97 hasLoggedApplication = PETSC_TRUE;
101 faceArea = sqrt(eta[k][j][i].x * eta[k][j][i].x + eta[k][j][i].y * eta[k][j][i].y + eta[k][j][i].z * eta[k][j][i].z);
102 momentumSource = drivingForceMagnitude * forceScalingFactor * faceArea;
103 rct[k][j][i].
y += momentumSource;
106 if (!hasLoggedApplication) {
108 hasLoggedApplication = PETSC_TRUE;
112 faceArea = sqrt(zet[k][j][i].x * zet[k][j][i].x + zet[k][j][i].y * zet[k][j][i].y + zet[k][j][i].z * zet[k][j][i].z);
113 momentumSource = drivingForceMagnitude * forceScalingFactor * faceArea;
114 rct[k][j][i].
z += momentumSource;
117 if (!hasLoggedApplication) {
119 hasLoggedApplication = PETSC_TRUE;
132 ierr = DMDAVecRestoreArray(user->
fda, Rct, &rct); CHKERRQ(ierr);
133 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, (
const Cmpnts***)&csi); CHKERRQ(ierr);
134 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, (
const Cmpnts***)&eta); CHKERRQ(ierr);
135 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, (
const Cmpnts***)&zet); CHKERRQ(ierr);
136 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, (
const PetscReal***)&nvert); CHKERRQ(ierr);
138 PetscFunctionReturn(0);
PetscErrorCode ComputeDrivenChannelFlowSource(UserCtx *user, Vec Rct)
Internal helper implementation: ComputeDrivenChannelFlowSource().