18 PetscFunctionBeginUser;
32 PetscFunctionReturn(0);
37 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
39 const PetscInt im_phys = info.mx - 1;
40 const PetscInt jm_phys = info.my - 1;
41 const PetscInt km_phys = info.mz - 1;
48 (
double)u_cart, (
double)v_cart, (
double)w_cart,
55 PetscFunctionReturn(0);
59 const PetscBool needs_flow_dir = (PetscBool)(
63 PetscInt flow_axis = 0;
64 PetscReal flow_dir_sign = 1.0;
72 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER,
73 "Streamwise Constant and Poiseuille IC modes require either an INLET face or -flow_direction.");
74 flow_axis = (PetscInt)fd / 2;
75 flow_dir_sign = ((PetscInt)fd % 2 == 0) ? 1.0 : -1.0;
77 (
int)fd, (
int)flow_axis, (
double)flow_dir_sign);
81 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
82 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
83 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
84 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
87 ierr = DMDAVecGetArray(user->
fda, user->
Ucont, &ucont_arr); CHKERRQ(ierr);
90 const PetscInt xs = info.xs, xe = info.xs + info.xm;
91 const PetscInt ys = info.ys, ye = info.ys + info.ym;
92 const PetscInt zs = info.zs, ze = info.zs + info.zm;
94 for (k = zs; k < ze; k++) {
95 for (j = ys; j < ye; j++) {
96 for (i = xs; i < xe; i++) {
109 const PetscBool is_interior = (i > 0 && i < im_phys &&
110 j > 0 && j < jm_phys &&
111 k > 0 && k < km_phys);
114 Cmpnts ucont_val = {0.0, 0.0, 0.0};
115 PetscReal normal_velocity_mag = 0.0;
125 PetscInt cs1, cs2, n1, n2;
126 PetscBool per1, per2;
127 if (flow_axis == 0) { cs1 = j; cs2 = k; n1 = jm_phys; n2 = km_phys;
129 else if (flow_axis == 1) { cs1 = i; cs2 = k; n1 = im_phys; n2 = km_phys;
131 else { cs1 = i; cs2 = j; n1 = im_phys; n2 = jm_phys;
139 const PetscReal half1 = 0.5 * (PetscReal)(n1 - 1);
140 const PetscReal half2 = 0.5 * (PetscReal)(n2 - 1);
141 const PetscReal n1_norm = ((PetscReal)cs1 - 0.5 - half1) / half1;
142 const PetscReal n2_norm = ((PetscReal)cs2 - 0.5 - half2) / half2;
143 const PetscReal f1 = per1 ? 1.0 : (1.0 - n1_norm * n1_norm);
144 const PetscReal f2 = per2 ? 1.0 : (1.0 - n2_norm * n2_norm);
146 if (normal_velocity_mag < 0.0) normal_velocity_mag = 0.0;
155 if (normal_velocity_mag != 0.0) {
156 const PetscReal signed_vel = normal_velocity_mag * flow_dir_sign * user->
GridOrientation;
157 if (flow_axis == 0) {
158 const PetscReal area = sqrt(csi_arr[k][j][i].x * csi_arr[k][j][i].x +
159 csi_arr[k][j][i].y * csi_arr[k][j][i].y +
160 csi_arr[k][j][i].z * csi_arr[k][j][i].z);
161 ucont_val.
x = signed_vel * area;
162 }
else if (flow_axis == 1) {
163 const PetscReal area = sqrt(eta_arr[k][j][i].x * eta_arr[k][j][i].x +
164 eta_arr[k][j][i].y * eta_arr[k][j][i].y +
165 eta_arr[k][j][i].z * eta_arr[k][j][i].z);
166 ucont_val.
y = signed_vel * area;
168 const PetscReal area = sqrt(zet_arr[k][j][i].x * zet_arr[k][j][i].x +
169 zet_arr[k][j][i].y * zet_arr[k][j][i].y +
170 zet_arr[k][j][i].z * zet_arr[k][j][i].z);
171 ucont_val.
z = signed_vel * area;
174 ucont_arr[k][j][i] = ucont_val;
179 ierr = DMDAVecRestoreArray(user->
fda, user->
Ucont, &ucont_arr); CHKERRQ(ierr);
182 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
183 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
184 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
188 PetscFunctionReturn(0);