Skip to content

Commit 52f4fb9

Browse files
Merge pull request #78 from ProjectTorreyPines/bug_fix
Quick bug fix: subset_do does not need space kwarg space keyword argument was being used in subset_do when use_nodes was true but this requried unnecessary creation of empty dummy input when use_nodes was not true. With _parent fields in IMASdd ids, we can actually get the space object corresponding to a grid subset. So new functions have been added to get the parent objects: get_grid_ggd: gets parent grid_ggd from space or grid_subset get_space: gets corresponding space of a grid_subset from the parent. New tests for testing subset_tools have been added as well. Since the previous 3.0.0 has a bug because of this, minor version has been rolled up.
2 parents d88fbe9 + 443eddd commit 52f4fb9

File tree

4 files changed

+89
-10
lines changed

4 files changed

+89
-10
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "IMASggd"
22
uuid = "b7b5e640-9b39-4803-84eb-376048795def"
33
authors = ["Anchal Gupta <guptaa@fusion.gat.com>"]
4-
version = "3.0.0"
4+
version = "3.1.0"
55

66
[deps]
77
ArgParse = "c7e460c6-2fb9-53a9-8c5b-16f535851c63"

docs/src/index.md

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ get_subset_space
3535
get_grid_subset
3636
get_subset_boundary_inds
3737
get_subset_boundary
38+
get_grid_ggd
39+
get_space
3840
subset_do
3941
get_subset_centers
4042
project_prop_on_subset!

src/subset_tools.jl

+27-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ export get_subset_space
33
export get_grid_subset
44
export get_subset_boundary_inds
55
export get_subset_boundary
6+
export get_grid_ggd
7+
export get_space
68
export subset_do
79
export get_subset_centers
810
export project_prop_on_subset!
@@ -162,26 +164,43 @@ function get_subset_boundary(
162164
return ret_subset
163165
end
164166

167+
"""
168+
get_grid_ggd(subset::Union{all__grid_subset, all__space})::all__grid_ggd
169+
170+
Get the parent grid_ggd of a `grid_subset` or `space` object.
171+
"""
172+
function get_grid_ggd(subset::Union{all__grid_subset, all__space})::all__grid_ggd
173+
return getfield(getfield(subset, :_parent).value, :_parent).value
174+
end
175+
176+
"""
177+
get_space_from_subset(subset::all__grid_subset)::all__space
178+
179+
Get the corresponding space in parent grid_ggd for a grid_subset object.
180+
"""
181+
function get_space(subset::all__grid_subset)::all__space
182+
grid_ggd = get_grid_ggd(subset)
183+
return grid_ggd.space[subset.element[1].object[1].space]
184+
end
185+
165186
"""
166187
subset_do(
167188
set_operator,
168189
itrs::Vararg{all__grid_subset};
169-
space::all__space,
170190
use_nodes=false,
171191
)::all__grid_subset
172192
173193
Function to perform any set operation (intersect, union, setdiff etc.) on
174194
subset.element to generate a list of elements to go to subset object. If use_nodes is
175-
true, the set operation will be applied on the set of nodes from subset.element, space
176-
argument is required for this.
195+
true, the set operation will be applied on the set of nodes from subset.element.
177196
"""
178197
function subset_do(
179198
set_operator,
180199
itrs::Vararg{all__grid_subset};
181-
space::all__space,
182200
use_nodes=false,
183201
)::all__grid_subset
184202
if use_nodes
203+
space = get_space(itrs[1])
185204
ele_inds = set_operator(
186205
[
187206
union([
@@ -195,10 +214,10 @@ function subset_do(
195214
ele_inds = set_operator(
196215
[[ele.object[1].index for ele subset.element] for subset itrs]...,
197216
)
198-
dim = itrs[1][1].object[1].dimension
217+
dim = itrs[1].element[1].object[1].dimension
199218
end
200-
ret_subset = typeof(itrs[1][1])()
201-
space_number = itrs[1][1].object[1].space
219+
ret_subset = typeof(itrs[1])()
220+
space_number = itrs[1].element[1].object[1].space
202221
add_subset_element!(ret_subset, space_number, dim, ele_inds)
203222
return ret_subset
204223
end
@@ -404,7 +423,7 @@ Faster deepcopy function for grid_subset object. This function is used to create
404423
copy of a grid_subset object bypassing several checks performed by IMASdd.
405424
"""
406425
function deepcopy_subset(subset::all__grid_subset)::all__grid_subset
407-
new_subset = all__grid_subset()
426+
new_subset = typeof(subset)()
408427

409428
base = getfield(subset, :base)
410429
new_base = getfield(new_subset, :base)

test/runtests.jl

+59-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import IMASggd: interp, get_kdtree, project_prop_on_subset!, get_grid_subset
1+
import IMASggd:
2+
interp, get_kdtree, project_prop_on_subset!, get_grid_subset, get_grid_ggd,
3+
get_subset_boundary, subset_do, deepcopy_subset
24
using IMASdd: IMASdd
35
import Statistics: mean
46
using Test
@@ -22,6 +24,9 @@ function parse_commandline()
2224
["--interpeqt"],
2325
Dict(:help => "Test interpolation of equilibrium time slice",
2426
:action => :store_true),
27+
["--subset_tools"],
28+
Dict(:help => "Test subset tools",
29+
:action => :store_true),
2530
)
2631
args = ArgParse.parse_args(s)
2732
if !any(values(args)) # If no flags are set, run all tests
@@ -157,6 +162,59 @@ if args["projection"]
157162
end
158163
end
159164

165+
if args["subset_tools"]
166+
@testset "test subset_tools" begin
167+
grid_ggd = ids.edge_profiles.grid_ggd[1]
168+
space = grid_ggd.space[1]
169+
170+
@test grid_ggd == get_grid_ggd(space)
171+
172+
subset_core = get_grid_subset(grid_ggd, 22)
173+
subset_sol = get_grid_subset(grid_ggd, 23)
174+
subset_odr = get_grid_subset(grid_ggd, 24)
175+
subset_idr = get_grid_subset(grid_ggd, 25)
176+
subset_otarget = get_grid_subset(grid_ggd, 13)
177+
subset_itarget = get_grid_subset(grid_ggd, 14)
178+
179+
subset_corebnd = get_grid_subset(grid_ggd, 15)
180+
subset_separatrix = get_grid_subset(grid_ggd, 16)
181+
subset_pfrcut = get_grid_subset(grid_ggd, 8)
182+
subset_otsep = get_grid_subset(grid_ggd, 103)
183+
subset_itsep = get_grid_subset(grid_ggd, 104)
184+
185+
core_bdry = get_subset_boundary(space, subset_core)
186+
sol_bdry = get_subset_boundary(space, subset_sol)
187+
idr_bdry = get_subset_boundary(space, subset_idr)
188+
odr_bdry = get_subset_boundary(space, subset_odr)
189+
190+
@test subset_pfrcut.element ==
191+
subset_do(intersect, idr_bdry, odr_bdry).element
192+
@test subset_corebnd.element ==
193+
subset_do(setdiff, core_bdry, sol_bdry).element
194+
@test subset_separatrix.element ==
195+
subset_do(intersect, sol_bdry,
196+
subset_do(union, core_bdry, odr_bdry, idr_bdry)).element
197+
@test subset_otsep.element ==
198+
subset_do(
199+
intersect,
200+
subset_separatrix,
201+
subset_otarget;
202+
use_nodes=true,
203+
).element
204+
@test subset_itsep.element ==
205+
subset_do(
206+
intersect,
207+
subset_separatrix,
208+
subset_itarget;
209+
use_nodes=true,
210+
).element
211+
212+
sol_copy = deepcopy_subset(subset_sol)
213+
214+
@test subset_sol == deepcopy_subset(subset_sol)
215+
end
216+
end
217+
160218
if args["in"]
161219
@testset "test ∈" begin
162220
grid_ggd = ids.edge_profiles.grid_ggd[1]

0 commit comments

Comments
 (0)