xref: /libCEED/python/ceed_operator.py (revision a8d322087fa8f150327cdc2bf14a171452b711ec)
1f2d2bf5dSjeremylt# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2f2d2bf5dSjeremylt# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3f2d2bf5dSjeremylt# reserved. See files LICENSE and NOTICE for details.
4f2d2bf5dSjeremylt#
5f2d2bf5dSjeremylt# This file is part of CEED, a collection of benchmarks, miniapps, software
6f2d2bf5dSjeremylt# libraries and APIs for efficient high-order finite element and spectral
7f2d2bf5dSjeremylt# element discretizations for exascale applications. For more information and
8f2d2bf5dSjeremylt# source code availability see http://github.com/ceed.
9f2d2bf5dSjeremylt#
10f2d2bf5dSjeremylt# The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
11f2d2bf5dSjeremylt# a collaborative effort of two U.S. Department of Energy organizations (Office
12f2d2bf5dSjeremylt# of Science and the National Nuclear Security Administration) responsible for
13f2d2bf5dSjeremylt# the planning and preparation of a capable exascale ecosystem, including
14f2d2bf5dSjeremylt# software, applications, hardware, advanced system engineering and early
15f2d2bf5dSjeremylt# testbed platforms, in support of the nation's exascale computing imperative.
16f2d2bf5dSjeremylt
17f2d2bf5dSjeremyltfrom _ceed_cffi import ffi, lib
18f2d2bf5dSjeremyltimport tempfile
19f2d2bf5dSjeremyltfrom abc import ABC
20f2d2bf5dSjeremyltfrom .ceed_constants import REQUEST_IMMEDIATE, REQUEST_ORDERED, NOTRANSPOSE
21f2d2bf5dSjeremylt
22f2d2bf5dSjeremylt# ------------------------------------------------------------------------------
23f2d2bf5dSjeremyltclass _OperatorBase(ABC):
24f2d2bf5dSjeremylt  """Ceed Operator: composed FE-type operations on vectors."""
25f2d2bf5dSjeremylt
26f2d2bf5dSjeremylt  # Attributes
27f2d2bf5dSjeremylt  _ceed = ffi.NULL
28f2d2bf5dSjeremylt  _pointer = ffi.NULL
29f2d2bf5dSjeremylt
30f2d2bf5dSjeremylt  # Destructor
31f2d2bf5dSjeremylt  def __del__(self):
32f2d2bf5dSjeremylt    # libCEED call
33f2d2bf5dSjeremylt    lib.CeedOperatorDestroy(self._pointer)
34f2d2bf5dSjeremylt
35f2d2bf5dSjeremylt  # Representation
36f2d2bf5dSjeremylt  def __repr__(self):
37f2d2bf5dSjeremylt    return "<CeedOperator instance at " + hex(id(self)) + ">"
38f2d2bf5dSjeremylt
39f2d2bf5dSjeremylt  # String conversion for print() to stdout
40f2d2bf5dSjeremylt  def __str__(self):
41f2d2bf5dSjeremylt    """View an Operator via print()."""
42f2d2bf5dSjeremylt
43f2d2bf5dSjeremylt    # libCEED call
44f2d2bf5dSjeremylt    with tempfile.NamedTemporaryFile() as key_file:
45f2d2bf5dSjeremylt      with open(key_file.name, 'r+') as stream_file:
46f2d2bf5dSjeremylt        stream = ffi.cast("FILE *", stream_file)
47f2d2bf5dSjeremylt
48f2d2bf5dSjeremylt        lib.CeedOperatorView(self._pointer[0], stream)
49f2d2bf5dSjeremylt
50f2d2bf5dSjeremylt        stream_file.seek(0)
51f2d2bf5dSjeremylt        out_string = stream_file.read()
52f2d2bf5dSjeremylt
53f2d2bf5dSjeremylt    return out_string
54f2d2bf5dSjeremylt
55f2d2bf5dSjeremylt  # Apply CeedOperator
56f2d2bf5dSjeremylt  def apply(self, u, v, request=REQUEST_IMMEDIATE):
57f2d2bf5dSjeremylt    """Apply Operator to a vector.
58f2d2bf5dSjeremylt
59f2d2bf5dSjeremylt       Args:
60f2d2bf5dSjeremylt         u: Vector containing input state or CEED_VECTOR_NONE if there are no
61f2d2bf5dSjeremylt              active inputs
62f2d2bf5dSjeremylt         v: Vector to store result of applying operator (must be distinct from u)
63f2d2bf5dSjeremylt              or CEED_VECTOR_NONE if there are no active outputs
64f2d2bf5dSjeremylt         **request: Ceed request, default CEED_REQUEST_IMMEDIATE"""
65f2d2bf5dSjeremylt
66f2d2bf5dSjeremylt    # libCEED call
67f2d2bf5dSjeremylt    lib.CeedOperatorApply(self._pointer[0], u._pointer[0], v._pointer[0],
68f2d2bf5dSjeremylt                          request)
69f2d2bf5dSjeremylt
70f2d2bf5dSjeremylt  # Apply CeedOperator
71f2d2bf5dSjeremylt  def apply_add(self, u, v, request=REQUEST_IMMEDIATE):
72f2d2bf5dSjeremylt    """Apply Operator to a vector and add result to output vector.
73f2d2bf5dSjeremylt
74f2d2bf5dSjeremylt       Args:
75f2d2bf5dSjeremylt         u: Vector containing input state or CEED_VECTOR_NONE if there are no
76f2d2bf5dSjeremylt              active inputs
77f2d2bf5dSjeremylt         v: Vector to sum in result of applying operator (must be distinct from u)
78f2d2bf5dSjeremylt              or CEED_VECTOR_NONE if there are no active outputs
79f2d2bf5dSjeremylt         **request: Ceed request, default CEED_REQUEST_IMMEDIATE"""
80f2d2bf5dSjeremylt
81f2d2bf5dSjeremylt    # libCEED call
82f2d2bf5dSjeremylt    lib.CeedOperatorApplyAdd(self._pointer[0], u._pointer[0], v._pointer[0],
83f2d2bf5dSjeremylt                             request)
84f2d2bf5dSjeremylt
85f2d2bf5dSjeremylt# ------------------------------------------------------------------------------
86f2d2bf5dSjeremyltclass Operator(_OperatorBase):
87f2d2bf5dSjeremylt  """Ceed Operator: composed FE-type operations on vectors."""
88f2d2bf5dSjeremylt
89f2d2bf5dSjeremylt  # Constructor
90f2d2bf5dSjeremylt  def __init__(self, ceed, qf, dqf = None, dqfT = None):
91f2d2bf5dSjeremylt    # CeedOperator object
92f2d2bf5dSjeremylt    self._pointer = ffi.new("CeedOperator *")
93f2d2bf5dSjeremylt
94f2d2bf5dSjeremylt    # Reference to Ceed
95f2d2bf5dSjeremylt    self._ceed = ceed
96f2d2bf5dSjeremylt
97f2d2bf5dSjeremylt    # libCEED call
98f2d2bf5dSjeremylt    lib.CeedOperatorCreate(self._ceed._pointer[0], qf._pointer[0],
99f2d2bf5dSjeremylt                           dqf._pointer[0] if dqf else ffi.NULL,
100f2d2bf5dSjeremylt                           dqfT._pointer[0] if dqfT else ffi.NULL,
101f2d2bf5dSjeremylt                           self._pointer)
102f2d2bf5dSjeremylt
103f2d2bf5dSjeremylt  # Add field to CeedOperator
104*a8d32208Sjeremylt  def set_field(self, fieldname, restriction, basis, vector):
105f2d2bf5dSjeremylt    """Provide a field to an Operator for use by its QFunction.
106f2d2bf5dSjeremylt
107f2d2bf5dSjeremylt       Args:
108f2d2bf5dSjeremylt         fieldname: name of the field (to be matched with the same name used
109f2d2bf5dSjeremylt                      by QFunction)
110f2d2bf5dSjeremylt         restriction: ElemRestriction
111f2d2bf5dSjeremylt         basis: Basis in which the field resides or CEED_BASIS_COLLOCATED
112f2d2bf5dSjeremylt                  if collocated with quadrature points
113f2d2bf5dSjeremylt         vector: Vector to be used by Operator or CEED_VECTOR_ACTIVE
114f2d2bf5dSjeremylt                   if field is active or CEED_VECTOR_NONE if using
115*a8d32208Sjeremylt                   CEED_EVAL_WEIGHT in the QFunction"""
116f2d2bf5dSjeremylt
117f2d2bf5dSjeremylt    # libCEED call
118f2d2bf5dSjeremylt    fieldnameAscii = ffi.new("char[]", fieldname.encode('ascii'))
119f2d2bf5dSjeremylt    lib.CeedOperatorSetField(self._pointer[0], fieldnameAscii,
120*a8d32208Sjeremylt                             restriction._pointer[0], basis._pointer[0],
121f2d2bf5dSjeremylt                             vector._pointer[0])
122f2d2bf5dSjeremylt
123f2d2bf5dSjeremylt# ------------------------------------------------------------------------------
124f2d2bf5dSjeremyltclass CompositeOperator(_OperatorBase):
125f2d2bf5dSjeremylt  """Ceed Composite Operator: composition of multiple Operators."""
126f2d2bf5dSjeremylt
127f2d2bf5dSjeremylt  # Constructor
128f2d2bf5dSjeremylt  def __init__(self, ceed):
129f2d2bf5dSjeremylt    # CeedOperator object
130f2d2bf5dSjeremylt    self._pointer = ffi.new("CeedOperator *")
131f2d2bf5dSjeremylt
132f2d2bf5dSjeremylt    # Reference to Ceed
133f2d2bf5dSjeremylt    self._ceed = ceed
134f2d2bf5dSjeremylt    # libCEED call
135f2d2bf5dSjeremylt    lib.CeedCompositeOperatorCreate(self._ceed._pointer[0], self._pointer)
136f2d2bf5dSjeremylt
137f2d2bf5dSjeremylt  # Add sub operators
138f2d2bf5dSjeremylt  def add_sub(self, subop):
139f2d2bf5dSjeremylt    """Add a sub-operator to a composite CeedOperator.
140f2d2bf5dSjeremylt
141f2d2bf5dSjeremylt       Args:
142f2d2bf5dSjeremylt         subop: sub-operator Operator"""
143f2d2bf5dSjeremylt
144f2d2bf5dSjeremylt    # libCEED call
145f2d2bf5dSjeremylt    lib.CeedCompositeOperatorAddSub(self._pointer[0], subop._pointer[0])
146f2d2bf5dSjeremylt
147f2d2bf5dSjeremylt# ------------------------------------------------------------------------------
148