void calc_geo_phantom(const long dims[DIMS], complex float* out, bool kspace, int phtype) { complex float* round = md_alloc(DIMS, dims, CFL_SIZE); complex float* angular = md_alloc(DIMS, dims, CFL_SIZE); switch (phtype) { case 1: sample(DIMS, dims, round, ARRAY_SIZE(phantom_geo1), phantom_geo1, kspace, true); sample(DIMS, dims, angular, ARRAY_SIZE(phantom_geo2), phantom_geo2, kspace, false); md_zadd(DIMS, dims, out, round, angular); break; case 2: sample(DIMS, dims, round, ARRAY_SIZE(phantom_geo4), phantom_geo4, kspace, true); sample(DIMS, dims, angular, ARRAY_SIZE(phantom_geo3), phantom_geo3, kspace, false); md_zadd(DIMS, dims, out, round, angular); break; default: assert(0); } md_free(round); md_free(angular); }
void tv_adjoint(unsigned int D, const long dims[D], unsigned int flags, complex float* out, const complex float* in) { unsigned int N = bitcount(flags); assert(N == dims[D - 1]); // we use the highest dim to store our different partial derivatives unsigned int flags2 = flags; complex float* tmp = md_alloc_sameplace(D - 1, dims, CFL_SIZE, out); md_clear(D - 1, dims, out, CFL_SIZE); md_clear(D - 1, dims, tmp, CFL_SIZE); for (unsigned int i = 0; i < N; i++) { unsigned int lsb = ffs(flags2) - 1; flags2 = MD_CLEAR(flags2, lsb); md_zfdiff_backwards(D - 1, dims, lsb, tmp, in + i * md_calc_size(D - 1, dims)); md_zadd(D - 1, dims, out, out, tmp); } md_free(tmp); assert(0 == flags2); }
static void prox_lineq_apply(const operator_data_t* _data, float mu, complex float* dst, const complex float* src) { UNUSED(mu); struct prox_lineq_data* pdata = CAST_DOWN(prox_lineq_data, _data); const struct linop_s* op = pdata->op; linop_normal(op, linop_domain(op)->N, linop_domain(op)->dims, pdata->tmp, src); md_zsub(linop_domain(op)->N, linop_domain(op)->dims, dst, src, pdata->tmp); md_zadd(linop_domain(op)->N, linop_domain(op)->dims, dst, dst, pdata->adj); }
static void perturb(const long dims[2], complex float* vecs, float amt) { complex float* noise = md_alloc(2, dims, CFL_SIZE); md_gaussian_rand(2, dims, noise); for (long j = 0; j < dims[1]; j++) { float nrm = md_znorm(1, dims, noise + j * dims[0]); complex float val = amt / nrm; md_zsmul(1, dims, noise + j * dims[0], noise + j * dims[0], val); } md_zadd(2, dims, vecs, vecs, noise); for (long j = 0; j < dims[1]; j++) { float nrm = md_znorm(1, dims, vecs + j * dims[0]); complex float val = 1 / nrm; md_zsmul(1, dims, vecs + j * dims[0], vecs + j * dims[0], val); } md_free(noise); }