@@ -98,7 +98,7 @@ def copy(self, obj=None):
9898 -----
9999 Copy semantics:
100100 - Immutable / scalar attributes are copied directly
101- - NumPy arrays and simple containers are shallow-copied where safe
101+ - Grid geometry and limiter masks are shared through limiter_handler
102102 - Selected complex objects are deep-copied (e.g. via copy.deepcopy)
103103 - Some large system objects are shared by reference (e.g. limiter_handler)
104104
@@ -122,17 +122,13 @@ def copy(self, obj=None):
122122 copy_into (self , obj , "dRdZ" )
123123 copy_into (self , obj , "nx" )
124124
125- copy_into (self , obj , "dR_dZ" , mutable = True )
126- copy_into (self , obj , "grid_points" , mutable = True )
127- copy_into (self , obj , "eqRidx" , mutable = True )
128- copy_into (self , obj , "eqZidx" , mutable = True )
129- copy_into (self , obj , "idx_grid_points" , mutable = True )
130- copy_into (self , obj , "R0Z0" , mutable = True )
131- copy_into (self , obj , "mask_inside_limiter" , mutable = True )
132- copy_into (self , obj , "mask_outside_limiter" , mutable = True )
133- copy_into (self , obj , "limiter_mask_out" , mutable = True )
134- copy_into (self , obj , "limiter_mask_for_plotting" , mutable = True )
135- copy_into (self , obj , "edge_mask" , mutable = True )
125+ copy_into (self , obj , "dR_dZ" )
126+ copy_into (self , obj , "eqRidx" )
127+ copy_into (self , obj , "eqZidx" )
128+ copy_into (self , obj , "R0Z0" )
129+ copy_into (self , obj , "mask_inside_limiter" )
130+ copy_into (self , obj , "mask_outside_limiter" )
131+ copy_into (self , obj , "limiter_mask_out" )
136132 obj .inputs = self .inputs [::] # shallow copy suffices
137133
138134 # *Should* not be necessary to copy this
@@ -187,46 +183,25 @@ def set_masks(self, eq):
187183 eq : FreeGSNKE Equilibrium object
188184 Equilibrium defining the computational domain, including 1D and 2D
189185 coordinate grids and limiter geometry.
186+
187+ Notes
188+ -----
189+ Fixed grid arrays are shared with ``eq.limiter_handler`` and treated as
190+ read-only by profile calculations.
190191 """
191192 self .dR = eq .R_1D [1 ] - eq .R_1D [0 ]
192193 self .dZ = eq .Z_1D [1 ] - eq .Z_1D [0 ]
193- self .dR_dZ = np .array ([self .dR , self .dZ ])
194- self .R0Z0 = np .array ([eq .R_1D [0 ], eq .Z_1D [0 ]])
195194 self .dRdZ = self .dR * self .dZ
196- self .grid_points = np .concatenate (
197- (eq .R [:, :, np .newaxis ], eq .Z [:, :, np .newaxis ]), axis = - 1
198- )
199195 self .nx , self .ny = np .shape (eq .R )
200- self .eqRidx = np .tile (np .arange (self .nx )[:, np .newaxis ], (1 , self .ny ))
201- self .eqZidx = np .tile (np .arange (self .ny )[:, np .newaxis ], (1 , self .nx )).T
202- self .idx_grid_points = np .concatenate (
203- (self .eqRidx [:, :, np .newaxis ], self .eqZidx [:, :, np .newaxis ]), axis = - 1
204- ).reshape (- 1 , 2 )
205196
206197 self .limiter_handler = eq .limiter_handler
207-
208- # self.core_mask_limiter = eq.limiter_handler.core_mask_limiter
209-
210- self .mask_inside_limiter = eq .limiter_handler .mask_inside_limiter
211-
212- mask_outside_limiter = np .logical_not (eq .limiter_handler .mask_inside_limiter )
213- # Note the factor 2 is not a typo: used in critical.inside_mask
214- self .mask_outside_limiter = (2 * mask_outside_limiter ).astype (float )
215-
216- self .limiter_mask_out = eq .limiter_handler .limiter_mask_out
217-
218- self .limiter_mask_for_plotting = (
219- eq .limiter_handler .mask_inside_limiter
220- + eq .limiter_handler .make_layer_mask (
221- eq .limiter_handler .mask_inside_limiter , layer_size = 1
222- )
223- ) > 0
224-
225- # set mask of the edge domain pixels
226- self .edge_mask = np .zeros_like (eq .R )
227- self .edge_mask [0 , :] = self .edge_mask [:, 0 ] = self .edge_mask [- 1 , :] = (
228- self .edge_mask [:, - 1 ]
229- ) = 1
198+ self .dR_dZ = self .limiter_handler .dR_dZ
199+ self .R0Z0 = self .limiter_handler .R0Z0
200+ self .eqRidx = self .limiter_handler .eqRidx
201+ self .eqZidx = self .limiter_handler .eqZidx
202+ self .mask_inside_limiter = self .limiter_handler .mask_inside_limiter
203+ self .mask_outside_limiter = self .limiter_handler .mask_outside_limiter
204+ self .limiter_mask_out = self .limiter_handler .limiter_mask_out
230205
231206 def select_refinement (self , eq , refine_jtor , nnx , nny ):
232207 """
@@ -408,9 +383,9 @@ def diverted_critical(
408383 )
409384 )[np .newaxis ]
410385 # build diverted_core_mask
411- diverted_core_mask = path .contains_points (self . idx_grid_points ). reshape (
412- ( self .nx , self . ny )
413- )
386+ diverted_core_mask = path .contains_points (
387+ self .limiter_handler . idx_grid_points
388+ ). reshape (( self . nx , self . ny ))
414389
415390 return opt , xpt , diverted_core_mask , psi_bndry
416391
0 commit comments