Huayi Wei
Huayi Wei
@Geniuswangwei 你把 FEALPy 更新一下, 就可以了。
这里底层的接口调整了一下
这就是在网格上定义一个数据的问题 NC = mesh.number_of_cells() mesh.cell_data['modulus'] = np.ones(NC) 然后,你就在后续的程序中直接访问这些就可以了
我们的实现是与维度和次数无关的实现方式, 没有switch 或者 if-else。 自由度节点和基函数都是程序根据网格和次数,自动计算出的。
``` @barycentric def basis(self, bc, index=np.s_[:], p=None): """ compute the basis function values at barycentric point bc Parameters ---------- bc : numpy.ndarray the shape of `bc` can be `(TD+1,)` or...
上面的代码对一维,二维和三维的网格,还有任意的 p 都是可以 work 的
https://github.com/weihuayi/fealpy/blob/master/fealpy/functionspace/LagrangeFiniteElementSpace.py
第一个 einsum 想把 measure 变成一个 (gdof, ldof) 的数组, 就是按列重复 ldof (这是插值点的个数)次,其实不需要这样做的。 guh 存储的是每个单元上每个插值点处梯度值,第二个 einsum 意思是,每个单元上每个插值点上的梯度值都对应乘以对应单元上的面积。 ``` measure = self.mesh.entity_measure('cell') NC = len(measure) ws = np.broadcast_to(measure[:, None], shape=(gdof, ldof)) deg =...
第二个 einsum 其实也可以不用, 下面这个做法也可以 ``` guh *= measure[:, None, None] ```
这个梯度恢复的函数从效率上讲有很多可以改进的地方,我抽时间改一个代码。einsum 函数功能很强大,灵活运用可以代替很多复杂的运算,但 numpy 的 einsum 并不支持多线程的运算,效率上有些问题。