Skip to content

Commit

Permalink
Wrap g0 array's offset methods in CartField/ZeroArray, and add a few …
Browse files Browse the repository at this point in the history
…more range methods that were not wrapped in CartField/ZeroArray. Checked a number of reg tests, including vm-tw-stream,vm-weibel,vm-sheath,vp tests,vm-lbo,gk-lbo,gk-etg,gk-sheath and they all pass.
  • Loading branch information
manauref committed Sep 18, 2022
1 parent e6e2839 commit 7bdc0b5
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 20 deletions.
101 changes: 81 additions & 20 deletions DataStruct/CartField.lua
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,9 @@ local function Field_meta_ctor(elct)
_assign = function(self, fact, fld)
self._zeroForOps:set(fact, fld._zeroForOps)
end,
_assignRange = function(self, fact, fld, rng)
self._zeroForOps:setRange(fact, fld._zeroForOps, rng)
end,
-- assignOffsetOneFld assumes that one of the input or output fields have fewer components than the other.
-- a) nCompOut > nCompIn: assigns all of the input field w/ part of the output field, the (0-based)
-- offset indicating which is the 1st component in the output field to assign.
Expand All @@ -626,11 +629,16 @@ local function Field_meta_ctor(elct)
"CartField:assignOffsetOneFld: Factor not a number")
assert(self:layout() == fld:layout(),
"CartField:assignOffsetOneFld: Fields should have same layout for sums to make sense")

-- Get number of cells for outer loop.
-- We do not need to use an indexer since we are simply accumulating cell-wise a subset of the components.
local numCells = self:_localShape()/self:numComponents()
ffiC.gkylCartFieldAssignOffset(fld:_localLower(), self:_localLower(), numCells, compStart, fld:numComponents(), self:numComponents(), fact, fld._data, self._data)
self._zeroForOps:setOffset(fact, fld._zeroForOps, compStart)
end,
_assignOffsetOneFldRange = function(self, fact, fld, compStart, rng)
assert(field_check_range(self, fld),
"CartField:assignOffsetOneFld: Can only assign fields with the same range")
assert(type(fact) == "number",
"CartField:assignOffsetOneFld: Factor not a number")
assert(self:layout() == fld:layout(),
"CartField:assignOffsetOneFld: Fields should have same layout for sums to make sense")
self._zeroForOps:setOffsetRange(fact, fld._zeroForOps, compStart, rng)
end,
_accumulateOneFld = function(self, fact, fld)
self._zeroForOps:accumulate(fact, fld._zeroForOps)
Expand All @@ -651,11 +659,16 @@ local function Field_meta_ctor(elct)
"CartField:accumulateOffsetOneFld: Factor not a number")
assert(self:layout() == fld:layout(),
"CartField:accumulateOffsetOneFld: Fields should have same layout for sums to make sense")

-- Get number of cells for outer loop.
-- We do not need to use an indexer since we are simply accumulating cell-wise a subset of the components.
local numCells = self:_localShape()/self:numComponents()
ffiC.gkylCartFieldAccumulateOffset(fld:_localLower(), self:_localLower(), numCells, compStart, fld:numComponents(), self:numComponents(), fact, fld._data, self._data)
self._zeroForOps:accumulateOffset(fact, fld._zeroForOps, compStart)
end,
_accumulateOffsetOneFldRange = function(self, fact, fld, compStart, rng)
assert(field_check_range(self, fld),
"CartField:accumulateOffsetOneFld: Can only accumulate fields with the same range")
assert(type(fact) == "number",
"CartField:accumulateOffsetOneFld: Factor not a number")
assert(self:layout() == fld:layout(),
"CartField:accumulateOffsetOneFld: Fields should have same layout for sums to make sense")
self._zeroForOps:accumulateOffsetRange(fact, fld._zeroForOps, compStart, rng)
end,
accumulate = isNumberType and
function (self, c1, fld1, ...)
Expand All @@ -669,6 +682,51 @@ local function Field_meta_ctor(elct)
function (self, c1, fld1, ...)
assert(false, "CartField:accumulate: Accumulate only works on numeric fields")
end,
accumulateOffset = isNumberType and
function (self, c1, fld1, compStart1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/3
self:_accumulateOffsetOneFld(c1, fld1, compStart1) -- Accumulate first field.
for i = 1, nFlds do -- Accumulate rest of the fields
self:_accumulateOffsetOneFld(args[3*i-2], args[3*i-1], args[3*i])
end
end or
function (self, c1, fld1, compStart1, ...)
assert(false, "CartField:accumulateOffset: Accumulate only works on numeric fields")
end,
combine = isNumberType and
function (self, c1, fld1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/2
self:_assign(c1, fld1) -- Assign first field.
for i = 1, nFlds do -- Accumulate rest of the fields.
self:_accumulateOneFld(args[2*i-1], args[2*i])
end
end or
function (self, c1, fld1, ...)
assert(false, "CartField:combine: Combine only works on numeric fields")
end,
combineOffset = isNumberType and
function (self, c1, fld1, compStart1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/3
local notAssigned = {}
for i = 1, self:numComponents() do table.insert(notAssigned,true) end -- Boolean indicates if already assigned.
self:_assignOffsetOneFld(c1, fld1, compStart1) -- Assign first field.
notAssigned[compStart1+1] = false
for i = 1, nFlds do -- Accumulate rest of the fields.
local cOff = args[3*i]
if notAssigned[cOff+1] then
self:_assignOffsetOneFld(args[3*i-2], args[3*i-1], cOff)
notAssigned[cOff+1] = false
else
self:_accumulateOffsetOneFld(args[3*i-2], args[3*i-1], cOff)
end
end
end or
function (self, c1, fld1, ...)
assert(false, "CartField:combineOffset: Combine only works on numeric fields")
end,
accumulateRange = isNumberType and
function (self, c1, fld1, ...)
local args = {...} -- Package up rest of args as table.
Expand All @@ -682,45 +740,48 @@ local function Field_meta_ctor(elct)
function (self, c1, fld1, ...)
assert(false, "CartField:accumulate: Accumulate only works on numeric fields")
end,
accumulateOffset = isNumberType and
accumulateOffsetRange = isNumberType and
function (self, c1, fld1, compStart1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/3
self:_accumulateOffsetOneFld(c1, fld1, compStart1) -- Accumulate first field.
local rng = args[#args]
self:_accumulateOffsetOneFldRange(c1, fld1, compStart1, rng) -- Accumulate first field.
for i = 1, nFlds do -- Accumulate rest of the fields
self:_accumulateOffsetOneFld(args[3*i-2], args[3*i-1], args[3*i])
self:_accumulateOffsetOneFldRange(args[3*i-2], args[3*i-1], args[3*i], rng)
end
end or
function (self, c1, fld1, compStart1, ...)
assert(false, "CartField:accumulateOffset: Accumulate only works on numeric fields")
end,
combine = isNumberType and
combineRange = isNumberType and
function (self, c1, fld1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/2
self:_assign(c1, fld1) -- Assign first field.
local rng = args[#args]
self:_assignRange(c1, fld1, rng) -- Assign first field.
for i = 1, nFlds do -- Accumulate rest of the fields.
self:_accumulateOneFld(args[2*i-1], args[2*i])
self:_accumulateOneFldRange(args[2*i-1], args[2*i], rng)
end
end or
function (self, c1, fld1, ...)
assert(false, "CartField:combine: Combine only works on numeric fields")
end,
combineOffset = isNumberType and
combineOffsetRange = isNumberType and
function (self, c1, fld1, compStart1, ...)
local args = {...} -- Package up rest of args as table.
local nFlds = #args/3
local rng = args[#args]
local notAssigned = {}
for i = 1, self:numComponents() do table.insert(notAssigned,true) end -- Boolean indicates if already assigned.
self:_assignOffsetOneFld(c1, fld1, compStart1) -- Assign first field.
self:_assignOffsetOneFldRange(c1, fld1, compStart1, rng) -- Assign first field.
notAssigned[compStart1+1] = false
for i = 1, nFlds do -- Accumulate rest of the fields.
local cOff = args[3*i]
if notAssigned[cOff+1] then
self:_assignOffsetOneFld(args[3*i-2], args[3*i-1], cOff)
self:_assignOffsetOneFldRange(args[3*i-2], args[3*i-1], cOff, rng)
notAssigned[cOff+1] = false
else
self:_accumulateOffsetOneFld(args[3*i-2], args[3*i-1], cOff)
self:_accumulateOffsetOneFldRange(args[3*i-2], args[3*i-1], cOff, rng)
end
end
end or
Expand Down
71 changes: 71 additions & 0 deletions DataStruct/ZeroArray.lua
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,20 @@ struct gkyl_array* gkyl_array_clear(struct gkyl_array *out, double val);
struct gkyl_array* gkyl_array_accumulate(struct gkyl_array *out,
double a, const struct gkyl_array *inp);

/**
* Compute out = out + a*inp[coff] where coff is a component-offset if
* out->ncomp < inp->ncomp, or out[coff] = out[coff]+ a*inp if
* out->ncomp > inp->ncomp. Returns out.
*
* @param out Output array
* @param a Factor to multiply input array
* @param inp Input array
* @param coff Component offset
* @return out array
*/
struct gkyl_array* gkyl_array_accumulate_offset(struct gkyl_array *out,
double a, const struct gkyl_array *inp, int coff);

/**
* Set out = a*inp. Returns out.
*
Expand All @@ -148,6 +162,20 @@ struct gkyl_array* gkyl_array_accumulate(struct gkyl_array *out,
struct gkyl_array* gkyl_array_set(struct gkyl_array *out,
double a, const struct gkyl_array *inp);

/**
* Set out = a*inp[coff] where coff is a component-offset if
* out->ncomp < inp->ncomp, or out[coff] = a*inp if
* out->ncomp > inp->ncomp. Returns out.
*
* @param out Output array
* @param a Factor to multiply input array
* @param inp Input array
* @param coff Component offset
* @return out array
*/
struct gkyl_array* gkyl_array_set_offset(struct gkyl_array *out,
double a, const struct gkyl_array *inp, int coff);

/**
* Scale out = a*out. Returns out.
*
Expand Down Expand Up @@ -181,6 +209,20 @@ struct gkyl_array* gkyl_array_clear_range(struct gkyl_array *out, double val,
struct gkyl_array* gkyl_array_accumulate_range(struct gkyl_array *out,
double a, const struct gkyl_array *inp, struct gkyl_range range);

/**
* Compute out = out + a*inp[coff] where coff is a component-offset if
* out->ncomp < inp->ncomp, or out[coff] = out[coff]+ a*inp if
* out->ncomp > inp->ncomp, over a range of indices. Returns out.
*
* @param out Output array
* @param a Factor to multiply input array
* @param inp Input array
* @param coff Component offset
* @return out array
*/
struct gkyl_array* gkyl_array_accumulate_offset_range(struct gkyl_array *out,
double a, const struct gkyl_array *inp, int coff, struct gkyl_range range);

/**
* Set out = a*inp. Returns out.
*
Expand All @@ -193,6 +235,20 @@ struct gkyl_array* gkyl_array_accumulate_range(struct gkyl_array *out,
struct gkyl_array* gkyl_array_set_range(struct gkyl_array *out,
double a, const struct gkyl_array *inp, struct gkyl_range range);

/**
* Set out = a*inp[coff] where coff is a component-offset if
* out->ncomp < inp->ncomp, or out[coff] = a*inp if
* out->ncomp > inp->ncomp, over a range of indices. Returns out.
*
* @param out Output array
* @param a Factor to multiply input array
* @param inp Input array
* @return out array
* @param range Range specifying region to set
*/
struct gkyl_array* gkyl_array_set_offset_range(struct gkyl_array *out,
double a, const struct gkyl_array *inp, int coff, struct gkyl_range range);

/**
* Scale out = a*ut. Returns out.
*
Expand Down Expand Up @@ -350,12 +406,27 @@ local array_fn = {
set = function (self, val, fld)
ffiC.gkyl_array_set(self, val, fld)
end,
setOffset = function (self, val, fld, off)
ffiC.gkyl_array_set_offset(self, val, fld, off)
end,
accumulate = function (self, val, fld)
ffiC.gkyl_array_accumulate(self, val, fld)
end,
accumulateOffset = function (self, val, fld, off)
ffiC.gkyl_array_accumulate_offset(self, val, fld, off)
end,
setRange = function (self, val, fld, rng)
ffiC.gkyl_array_set_range(self, val, fld, rng)
end,
setOffsetRange = function (self, val, fld, off, rng)
ffiC.gkyl_array_set_offset_range(self, val, fld, off, rng)
end,
accumulateRange = function (self, val, fld, rng)
ffiC.gkyl_array_accumulate_range(self, val, fld, rng)
end,
accumulateOffsetRange = function (self, val, fld, off, rng)
ffiC.gkyl_array_accumulate_offset_range(self, val, fld, off, rng)
end,
scale = function (self, val)
ffiC.gkyl_array_scale(self, val)
end,
Expand Down

0 comments on commit 7bdc0b5

Please sign in to comment.