ceed_operator.py (572ff09c85e1de07bdd8bed4adbe59486604f1e4) ceed_operator.py (d99fa3c5cd91a1690aedf0679cbf290d44fec74c)
1# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3# reserved. See files LICENSE and NOTICE for details.
4#
5# This file is part of CEED, a collection of benchmarks, miniapps, software
6# libraries and APIs for efficient high-order finite element and spectral
7# element discretizations for exascale applications. For more information and
8# source code availability see http://github.com/ceed.

--- 132 unchanged lines hidden (view full) ---

141 or CEED_VECTOR_NONE if there are no active outputs
142 **request: Ceed request, default CEED_REQUEST_IMMEDIATE"""
143
144 # libCEED call
145 err_code = lib.CeedOperatorApplyAdd(self._pointer[0], u._pointer[0], v._pointer[0],
146 request)
147 self._ceed._check_error(err_code)
148
1# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3# reserved. See files LICENSE and NOTICE for details.
4#
5# This file is part of CEED, a collection of benchmarks, miniapps, software
6# libraries and APIs for efficient high-order finite element and spectral
7# element discretizations for exascale applications. For more information and
8# source code availability see http://github.com/ceed.

--- 132 unchanged lines hidden (view full) ---

141 or CEED_VECTOR_NONE if there are no active outputs
142 **request: Ceed request, default CEED_REQUEST_IMMEDIATE"""
143
144 # libCEED call
145 err_code = lib.CeedOperatorApplyAdd(self._pointer[0], u._pointer[0], v._pointer[0],
146 request)
147 self._ceed._check_error(err_code)
148
149 # Create Multigrid Level
150 def multigrid_create(self, p_mult_fine, rstr_coarse, basis_coarse):
151 """ Create a multigrid coarse operator and level transfer operators
152 for a CeedOperator with a Lagrange tensor basis for the active basis
153
154 Args:
155 p_mult_fine: L-vector multiplicity in parallel gather/scatter
156 basis_coarse: Coarse grid active vector basis
157 degree_coarse: Coarse grid basis polynomial order"""
158
159 # Operator pointers
160 opCoarsePointer = ffi.new("CeedOperator *")
161 opProlongPointer = ffi.new("CeedOperator *")
162 opRestrictPointer = ffi.new("CeedOperator *")
163
164 # libCEED call
165 lib.CeedOperatorMultigridLevelCreate(self._pointer[0],
166 p_mult_fine._pointer[0],
167 rstr_coarse._pointer[0],
168 basis_coarse._pointer[0],
169 opCoarsePointer,
170 opProlongPointer,
171 opRestrictPointer)
172
173 # Wrap operators
174 opCoarse = _OperatorWrap(
175 self._ceed, opCoarsePointer)
176 opProlong = _OperatorWrap(
177 self._ceed, opProlongPointer)
178 opRestrict = _OperatorWrap(
179 self._ceed, opRestrictPointer)
180
181 # Return
182 return [opCoarse, opProlong, opRestrict]
183
184 # Create Multigrid Level
185 def multigrid_create_tensor_h1(self, p_mult_fine, rstr_coarse, basis_coarse,
186 interp_C_to_F):
187 """ Create a multigrid coarse operator and level transfer operators
188 for a CeedOperator with a non-tensor basis for the active basis
189
190 Args:
191 p_mult_fine: L-vector multiplicity in parallel gather/scatter
192 rstr_coarse: Coarse grid restriction
193 basis_coarse: Coarse grid active vector basis
194 interp_C_to_F: Matrix for coarse to fine interpolation"""
195
196 # Setup arguments
197 interpCtoF_pointer = ffi.new("CeedScalar *")
198 interpCtoF_pointer = ffi.cast(
199 "CeedScalar *",
200 interp_C_to_F.__array_interface__['data'][0])
201
202 # Operator pointers
203 opCoarsePointer = ffi.new("CeedOperator *")
204 opProlongPointer = ffi.new("CeedOperator *")
205 opRestrictPointer = ffi.new("CeedOperator *")
206
207 # libCEED call
208 lib.CeedOperatorMultigridLevelCreateTensorH1(self._pointer[0],
209 p_mult_fine._pointer[0],
210 rstr_coarse._pointer[0],
211 basis_coarse._pointer[0],
212 interpCtoF_pointer,
213 opCoarsePointer,
214 opProlongPointer,
215 opRestrictPointer)
216
217 # Wrap operators
218 opCoarse = _OperatorWrap(
219 self._ceed, opCoarsePointer)
220 opProlong = _OperatorWrap(
221 self._ceed, opProlongPointer)
222 opRestrict = _OperatorWrap(
223 self._ceed, opRestrictPointer)
224
225 # Return
226 return [opCoarse, opProlong, opRestrict]
227
228 # Create Multigrid Level
229 def multigrid_create_h1(self, p_mult_fine, rstr_coarse, basis_coarse,
230 interp_C_to_F):
231 """ Create a multigrid coarse operator and level transfer operators
232 for a CeedOperator with a Lagrange tensor basis for the active basis
233
234 Args:
235 p_mult_fine: L-vector multiplicity in parallel gather/scatter
236 rstr_coarse: Coarse grid restriction
237 basis_coarse: Coarse grid active vector basis
238 interp_C_to_F: Matrix for coarse to fine interpolation"""
239
240 # Setup arguments
241 interpCtoF_pointer = ffi.new("CeedScalar *")
242 interpCtoF_pointer = ffi.cast(
243 "CeedScalar *",
244 interp_C_to_F.__array_interface__['data'][0])
245
246 # Operator pointers
247 opCoarsePointer = ffi.new("CeedOperator *")
248 opProlongPointer = ffi.new("CeedOperator *")
249 opRestrictPointer = ffi.new("CeedOperator *")
250
251 # libCEED call
252 lib.CeedOperatorMultigridLevelCreateH1(self._pointer[0],
253 p_mult_fine._pointer[0],
254 rstr_coarse._pointer[0],
255 basis_coarse._pointer[0],
256 interpCtoF_pointer,
257 opCoarsePointer,
258 opProlongPointer,
259 opRestrictPointer)
260
261 # Wrap operators
262 opCoarse = _OperatorWrap(
263 self._ceed, opCoarsePointer)
264 opProlong = _OperatorWrap(
265 self._ceed, opProlongPointer)
266 opRestrict = _OperatorWrap(
267 self._ceed, opRestrictPointer)
268
269 # Return
270 return [opCoarse, opProlong, opRestrict]
271
272
149# ------------------------------------------------------------------------------
150
151
152class Operator(_OperatorBase):
153 """Ceed Operator: composed FE-type operations on vectors."""
154
155 # Constructor
156 def __init__(self, ceed, qf, dqf=None, dqfT=None):

--- 57 unchanged lines hidden (view full) ---

214 subop: sub-operator Operator"""
215
216 # libCEED call
217 err_code = lib.CeedCompositeOperatorAddSub(
218 self._pointer[0], subop._pointer[0])
219 self._ceed._check_error(err_code)
220
221# ------------------------------------------------------------------------------
273# ------------------------------------------------------------------------------
274
275
276class Operator(_OperatorBase):
277 """Ceed Operator: composed FE-type operations on vectors."""
278
279 # Constructor
280 def __init__(self, ceed, qf, dqf=None, dqfT=None):

--- 57 unchanged lines hidden (view full) ---

338 subop: sub-operator Operator"""
339
340 # libCEED call
341 err_code = lib.CeedCompositeOperatorAddSub(
342 self._pointer[0], subop._pointer[0])
343 self._ceed._check_error(err_code)
344
345# ------------------------------------------------------------------------------
346
347
348class _OperatorWrap(Operator):
349 """Wrap a CeedOperator pointer in a Operator object."""
350
351 # Constructor
352 def __init__(self, ceed, pointer):
353 # CeedOperator object
354 self._pointer = pointer
355
356 # Reference to Ceed
357 self._ceed = ceed
358
359# ------------------------------------------------------------------------------