FENICS计算结果的处理
# 省略...
# u定义在mesh的基函数上,可看成是一个解向量
V = FunctionSpace(mesh, "Lagrange", 1)
u = Function(V)
因为u
中的数据是被封装起来的,只能通过类的方法取出,如果不借助说明书盲目地使用u
中的方法是相当不理智的。
在python的交互环境中,type(u)
可以告诉我们,u
所属的类。
>>> type(u)
<class 'dolfin.function.function.Function'>
知道它是什么类以后去官方手册上查,结果屁都没有。
dir(u)
可以告诉我们对象中的方法,一般情况下我们能使用的是不带下划线的方法。
>>> dir(u)
['T', '__abs__', '__add__', '__bool__', '__call__', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__div__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__round__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__weakref__', '__xor__', '_count', '_cpp_object', '_globalcount', '_hash', '_repr', '_repr_latex_', '_repr_png_', '_ufl_all_classes_', '_ufl_all_handler_names_', '_ufl_class_', '_ufl_coerce_', '_ufl_compute_hash_', '_ufl_err_str_', '_ufl_evaluate_scalar_', '_ufl_expr_reconstruct_', '_ufl_function_space', '_ufl_handler_name_', '_ufl_is_abstract_', '_ufl_is_differential_', '_ufl_is_evaluation_', '_ufl_is_in_reference_frame_', '_ufl_is_index_free_', '_ufl_is_literal_', '_ufl_is_restriction_', '_ufl_is_scalar_', '_ufl_is_shaping_', '_ufl_is_terminal_', '_ufl_is_terminal_modifier_', '_ufl_language_operators_', '_ufl_noslots_', '_ufl_num_ops_', '_ufl_num_typecodes_', '_ufl_obj_del_counts_', '_ufl_obj_init_counts_', '_ufl_profiling__del__', '_ufl_profiling__init__', '_ufl_regular__del__', '_ufl_regular__init__', '_ufl_required_methods_', '_ufl_required_properties_', '_ufl_shape', '_ufl_signature_data_', '_ufl_terminal_modifiers_', '_ufl_typecode_', 'assign', 'compute_vertex_values', 'copy', 'count', 'cpp_object', 'dx', 'eval', 'eval_cell', 'evaluate', 'extrapolate', 'function_space', 'geometric_dimension', 'get_allow_extrapolation', 'id', 'interpolate', 'is_cellwise_constant', 'leaf_node', 'name', 'rename', 'restrict', 'root_node', 'set_allow_extrapolation', 'split', 'sub', 'ufl_disable_profiling', 'ufl_domain', 'ufl_domains', 'ufl_element', 'ufl_enable_profiling', 'ufl_evaluate', 'ufl_free_indices', 'ufl_function_space', 'ufl_index_dimensions', 'ufl_operands', 'ufl_shape', 'value_dimension', 'value_rank', 'value_shape', 'vector']
然后尝试使用u.vector()[0]
可以发现他可以像数组一样使用。
# 赋值
u.vector()[0] = 100
# 取值
print(u.vector()[0])
书上的计算误差的语句已经只要改成(v.vector()-u.vector()).max()
就行啦!
如果想对类的方法进行更深入的了解,不妨试试help(u)
。
网友评论