Skip to content

Commit

Permalink
switch to CHKERRXX globally
Browse files Browse the repository at this point in the history
partially resolves #25
  • Loading branch information
Phil Tooley committed May 1, 2019
1 parent c64b258 commit ee7c7c5
Show file tree
Hide file tree
Showing 14 changed files with 205 additions and 205 deletions.
8 changes: 4 additions & 4 deletions src/basis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ Mat_unique build_basis_matrix(
PetscErrorCode perr = MatCreateMPIAIJWithArrays(
comm, idxn.size() - 1, PETSC_DECIDE, m_size, n_size, idxn.data(), idxm.data(), mdat.data(),
m_basis.get());
CHKERRABORT(comm, perr);
CHKERRXX(perr);

#ifdef DEBUG_VERBOSE
matrix_dbg_print(comm, *m_basis, "Basis Matrix");
Expand Down Expand Up @@ -174,7 +174,7 @@ Mat_unique build_warp_matrix(
// lambda needed here anyway to capture comm
auto get_raw_array = [comm](floating*& a, const Vec* v) -> void {
PetscErrorCode p = VecGetArray(*v, &a);
CHKERRABORT(comm, p);
CHKERRXX(p);
};
n_ary_for_each(get_raw_array, raw_arrs.begin(), raw_arrs.end(), displacements.begin());

Expand Down Expand Up @@ -237,15 +237,15 @@ Mat_unique build_warp_matrix(
// lambda needed here anyway to capture comm
auto restore_raw_array = [comm](floating*& a, const Vec* v) -> void {
PetscErrorCode p = VecRestoreArray(*v, &a);
CHKERRABORT(comm, p);
CHKERRXX(p);
};
n_ary_for_each(restore_raw_array, raw_arrs.begin(), raw_arrs.end(), displacements.begin());

Mat_unique warp = create_unique_mat();
perr = MatCreateMPIAIJWithArrays(
comm, idxn.size() - 1, idxn.size() - 1, mat_size, mat_size, idxn.data(), idxm.data(),
mdat.data(), warp.get());
CHKERRABORT(comm, perr);
CHKERRXX(perr);
debug_creation(*warp, "Warp matrix");

return warp;
Expand Down
52 changes: 26 additions & 26 deletions src/elastic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,9 @@ void Elastic::innerloop(integer outer_count)
// check convergence and break if below threshold
floating posmax, negmax;
PetscErrorCode perr = VecMax(*m_workspace->m_delta, nullptr, &posmax);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = VecMin(*m_workspace->m_delta, nullptr, &negmax);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
floating amax = std::max(std::fabs(posmax), std::fabs(negmax));
PetscPrintf(m_comm, "Maximum displacement: %.2f\n", amax);
floating aavg;
Expand Down Expand Up @@ -169,7 +169,7 @@ void Elastic::innerstep(integer inum, bool recalculate_lambda)
// TODO: can we reuse here?
PetscErrorCode perr = MatTransposeMatMult(*m_workspace->m_tmat, *m_workspace->m_tmat,
MAT_INITIAL_MATRIX, PETSC_DEFAULT, normmat.get());
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
debug_creation(*normmat, std::string("Mat_normal") + std::to_string(inum));
// precondition tmat2
block_precondition(*normmat, m_p_map->size(), m_p_map->m_ndim);
Expand All @@ -189,31 +189,31 @@ void Elastic::innerstep(integer inum, bool recalculate_lambda)
floating total_mult = lapl_mult * lambda_mult * m_lambda;
// calculate tmat2 + lambda*lapl2
perr = MatAXPY(*normmat, total_mult, *m_p_map->laplacian(), DIFFERENT_NONZERO_PATTERN);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);

// calculate rvec, to do this need to reuse stacked vector for [f-m f-m f-m f-m]
perr = VecWAXPY(
*m_workspace->m_globaltmps[0], -1.0, *m_p_registered->global_vec(), *m_fixed.global_vec());
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
m_workspace->duplicate_single_grad_to_stacked(0);
perr = MatMultTranspose(*m_workspace->m_tmat, *m_workspace->m_stacktmp, *m_workspace->m_rhs);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);

// apply memory term if needed
if (configuration.grab<bool>("with_memory"))
{
// build -lambda*a
Vec_unique disp = create_unique_vec();
perr = VecDuplicate(m_p_map->displacements(), disp.get());
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = VecCopy(m_p_map->displacements(), *disp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = VecScale(*disp, -total_mult);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);

// calculate vecdot(lapl_2, -lambda*a) and add to rhs in one operation
perr = MatMultAdd(*m_p_map->laplacian(), *disp, *m_workspace->m_rhs, *m_workspace->m_rhs);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
}

// Force free tmat as no longer needed
Expand All @@ -222,17 +222,17 @@ void Elastic::innerstep(integer inum, bool recalculate_lambda)
// solve for delta a
KSP_unique m_ksp = create_unique_ksp();
perr = KSPCreate(m_comm, m_ksp.get());
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = KSPSetOperators(*m_ksp, *normmat, *normmat);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = KSPSetUp(*m_ksp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = KSPSetFromOptions(*m_ksp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = KSPSetUp(*m_ksp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = KSPSolve(*m_ksp, *m_workspace->m_rhs, *m_workspace->m_delta);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
// update map
m_p_map->update(*m_workspace->m_delta);
// warp image
Expand Down Expand Up @@ -260,19 +260,19 @@ void Elastic::calculate_tmat(integer iternum __attribute__((unused)))
// Calculate average intensity 0.5(f+m)
// Constant offset needed later, does not affect gradients
PetscErrorCode perr = VecSet(*m_workspace->m_globaltmps[m_fixed.ndim()], -1.0);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
// NB Z = aX + bY + cZ has call signature VecAXPBYPCZ(Z, a, b, c, X, Y) because reasons....
perr = VecAXPBYPCZ(*m_workspace->m_globaltmps[m_fixed.ndim()], 0.5, 0.5, 1,
*m_fixed.global_vec(), *m_p_registered->global_vec());
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

// scatter this to local for later
perr = DMGlobalToLocalBegin(*m_fixed.dmda(), *m_workspace->m_globaltmps[m_fixed.ndim()],
INSERT_VALUES, *m_workspace->m_localtmp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
perr = DMGlobalToLocalEnd(*m_fixed.dmda(), *m_workspace->m_globaltmps[m_fixed.ndim()],
INSERT_VALUES, *m_workspace->m_localtmp);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);

// find average gradients
for (uinteger idim = 0; idim < m_fixed.ndim(); idim++)
Expand All @@ -284,20 +284,20 @@ void Elastic::calculate_tmat(integer iternum __attribute__((unused)))

// Negate average intensity to get 1 - 0.5(f+m) as needed by algorithm
perr = VecScale(*m_workspace->m_globaltmps[m_fixed.ndim()], -1.0);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

// scatter grads into stacked vector
m_workspace->scatter_grads_to_stacked();

// 3. copy basis into p_tmat
m_workspace->m_tmat = create_unique_mat();
perr = MatDuplicate(*m_p_map->basis(), MAT_COPY_VALUES, m_workspace->m_tmat.get());
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
debug_creation(*m_workspace->m_tmat, std::string("Mat_tmat_") + std::to_string(iternum));

// 4. left diagonal multiply p_tmat with stacked vector
perr = MatDiagonalScale(*m_workspace->m_tmat, *m_workspace->m_stacktmp, nullptr);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
}

void Elastic::save_debug_map(integer outer_count, integer inner_count)
Expand Down Expand Up @@ -438,19 +438,19 @@ floating Elastic::approximate_optimum_lambda(Mat& mat_a, Mat& mat_b, floating la
if (recalc_first)
{
perr = MatAXPY(*mat_c, lambda_mult * x_lo, mat_b, DIFFERENT_NONZERO_PATTERN);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
y_lo = get_condnum_by_poweriter(*mat_c, 0.01, 100);
}
recalc_first = true;

// Calculate at initial guess
perr = MatAXPY(*mat_c, lambda_mult * (x_mid - x_lo), mat_b, DIFFERENT_NONZERO_PATTERN);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
y_mid = get_condnum_by_poweriter(*mat_c, 0.01, 100);

// calculate at higher value
perr = MatAXPY(*mat_c, lambda_mult * (x_hi - x_mid), mat_b, DIFFERENT_NONZERO_PATTERN);
CHKERRABORT(m_comm, perr);
CHKERRXX(perr);
y_hi = get_condnum_by_poweriter(*mat_c, 0.01, 100);

PetscPrintf(
Expand Down
30 changes: 15 additions & 15 deletions src/fd_routines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,32 @@ Vec_unique fd::gradient_to_global_unique(const DM &dmda, const Vec &localvec, in
// (should have matching global, local and comm size)
Vec dm_local_vec;
PetscErrorCode perr = DMGetLocalVector(dmda, &dm_local_vec);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
if (!vecs_equivalent(dm_local_vec, localvec))
{
throw InternalError("provided vector invalid for given dmda object", __FILE__, __LINE__);
}
perr = DMRestoreLocalVector(dmda, &dm_local_vec);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

// New global vec must be a dmda global
Vec_unique grad = create_unique_vec();
perr = DMCreateGlobalVector(dmda, grad.get());
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

// Access local of this to have ghosts, global of grad to avoid later copy
// Recall grad and image share a DMDA
floating ***img_array,
***grad_array; // acceptable to use raw ptrs here as memory handled by PETSc
perr = DMDAVecGetArray(dmda, localvec, &img_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
perr = DMDAVecGetArray(dmda, *(grad.get()), &grad_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

integer i_lo, i_hi, j_lo, j_hi, k_lo, k_hi;
// This returns corners + widths so add lo to get hi
perr = DMDAGetCorners(dmda, &i_lo, &j_lo, &k_lo, &i_hi, &j_hi, &k_hi);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
i_hi += i_lo;
j_hi += j_lo;
k_hi += k_lo;
Expand All @@ -70,9 +70,9 @@ Vec_unique fd::gradient_to_global_unique(const DM &dmda, const Vec &localvec, in
}
// Release pointers and allow petsc to cleanup
perr = DMDAVecRestoreArray(dmda, localvec, &img_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
perr = DMDAVecRestoreArray(dmda, *(grad.get()), &grad_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

return grad;
}
Expand All @@ -83,27 +83,27 @@ void fd::gradient_existing(const DM &dmda, const Vec &srcvec, Vec &tgtvec, integ
// (should have matching global, local and comm size)
Vec dm_local_vec;
PetscErrorCode perr = DMGetLocalVector(dmda, &dm_local_vec);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
if (!vecs_equivalent(dm_local_vec, srcvec))
{
throw InternalError("provided srcvec invalid for given dmda object", __FILE__, __LINE__);
}
perr = DMRestoreLocalVector(dmda, &dm_local_vec);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

// Access local of this to have ghosts, global of grad to avoid later copy
// Recall grad and image share a DMDA
floating ***img_array,
***grad_array; // acceptable to use raw ptrs here as memory handled by PETSc
perr = DMDAVecGetArray(dmda, srcvec, &img_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
perr = DMDAVecGetArray(dmda, tgtvec, &grad_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);

integer i_lo, i_hi, j_lo, j_hi, k_lo, k_hi;
// This returns corners + widths so add lo to get hi
perr = DMDAGetCorners(dmda, &i_lo, &j_lo, &k_lo, &i_hi, &j_hi, &k_hi);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
i_hi += i_lo;
j_hi += j_lo;
k_hi += k_lo;
Expand All @@ -125,7 +125,7 @@ void fd::gradient_existing(const DM &dmda, const Vec &srcvec, Vec &tgtvec, integ
}
// Release pointers and allow petsc to cleanup
perr = DMDAVecRestoreArray(dmda, srcvec, &img_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
perr = DMDAVecRestoreArray(dmda, tgtvec, &grad_array);
CHKERRABORT(PETSC_COMM_WORLD, perr);
CHKERRXX(perr);
}
4 changes: 2 additions & 2 deletions src/hdfwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,10 @@ void HDFWriter::write_3d_dataset_parallel(uinteger ndim, const std::vector<hsize

const floating* imgdata;
PetscErrorCode perr = VecGetArrayRead(datavec, &imgdata);
CHKERRABORT(_comm, perr);
CHKERRXX(perr);
H5Dwrite(dset_h, H5T_NATIVE_DOUBLE, dspace_h, fspace_h, plist_h, imgdata);
perr = VecRestoreArrayRead(datavec, &imgdata);
CHKERRABORT(_comm, perr);
CHKERRXX(perr);

H5Dclose(dset_h);
H5Sclose(fspace_h);
Expand Down
6 changes: 3 additions & 3 deletions src/image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,15 @@ Image::load_file(const std::string& path, const ImageBase* existing, MPI_Comm co
intvector shape(3, 0), offset(3, 0);
PetscErrorCode perr = DMDAGetCorners(
*new_image->dmda(), &offset[0], &offset[1], &offset[2], &shape[0], &shape[1], &shape[2]);
CHKERRABORT(comm, perr);
CHKERRXX(perr);
// std::transform(shape.cbegin(), shape.cend(), offset.cbegin(), shape.begin(), std::minus<>());

floating ***vecptr(nullptr);
perr = DMDAVecGetArray(*new_image->dmda(), *new_image->global_vec(), &vecptr);
CHKERRABORT(comm, perr);
CHKERRXX(perr);
loader->copy_scaled_chunk(vecptr, shape, offset);
perr = DMDAVecRestoreArray(*new_image->dmda(), *new_image->global_vec(), &vecptr);
CHKERRABORT(comm, perr);
CHKERRXX(perr);

new_image->normalize();

Expand Down
Loading

0 comments on commit ee7c7c5

Please sign in to comment.