From 5c7e22ba5ad50e9fa8a812879556637d940d85f8 Mon Sep 17 00:00:00 2001 From: wpx <1143615697@qq.com> Date: Thu, 17 Oct 2024 19:37:57 +0800 Subject: [PATCH] update --- fealpy/fem/__init__.py | 1 + fealpy/fem/linear_block_form.py | 34 +++++++++++++++++++++++++++++++++ fealpy/mesh/triangle_mesh.py | 1 + 3 files changed, 36 insertions(+) create mode 100644 fealpy/fem/linear_block_form.py diff --git a/fealpy/fem/__init__.py b/fealpy/fem/__init__.py index f29297e5f..0bdcde691 100644 --- a/fealpy/fem/__init__.py +++ b/fealpy/fem/__init__.py @@ -6,6 +6,7 @@ from .linear_form import LinearForm from .semilinear_form import SemilinearForm from .block_form import BlockForm +from .linear_block_form import LinearBlockForm ### Cell Operator from .scalar_diffusion_integrator import ScalarDiffusionIntegrator diff --git a/fealpy/fem/linear_block_form.py b/fealpy/fem/linear_block_form.py new file mode 100644 index 000000000..b36b97bdc --- /dev/null +++ b/fealpy/fem/linear_block_form.py @@ -0,0 +1,34 @@ +from .form import Form +from typing import List,overload, Literal, Optional +from ..typing import TensorLike +from ..sparse import COOTensor + +from ..backend import backend_manager as bm + + + + +class LinearBlockForm(Form): + _V = None + + def __init__(self, blocks:List): + self.blocks = blocks + self.sparse_shape = self._get_sparse_shape() + + def _get_sparse_shape(self): + shape = [i._get_sparse_shape() for i in self.blocks] + return (bm.sum(shape), ) + + @overload + def assembly(self, *, retain_ints: bool=False) -> TensorLike: ... + @overload + def assembly(self, *, format: Literal['coo'], retain_ints: bool=False) -> COOTensor: ... + @overload + def assembly(self, *, format: Literal['dense'], retain_ints: bool=False) -> TensorLike: ... + def assembly(self, *, format='dense', retain_ints: bool=False): + self._V = [i.assembly(format=format, retain_ints=retain_ints)for i in self.blocks] + self._v = bm.concatenate(self._V) + return self._V + +Form.register(LinearBlockForm) + diff --git a/fealpy/mesh/triangle_mesh.py b/fealpy/mesh/triangle_mesh.py index 83090d503..fba06f585 100644 --- a/fealpy/mesh/triangle_mesh.py +++ b/fealpy/mesh/triangle_mesh.py @@ -69,6 +69,7 @@ def quadrature_formula(self, q: int, etype: Union[int, str]='cell', if etype == 2: from ..quadrature.stroud_quadrature import StroudQuadrature + from ..quadrature import TriangleQuadrature if q > 9: quad = StroudQuadrature(2, q) else: