我想创建一个面向对象的有限元程序。我有一个Node类。由于有限元网格(由Mesh类表示)中的节点是不同的,因此我将Node类创建为值类。当实例化Node类的对象数组时,我将该对象数组分配给Mesh的nodes属性。我也有一个Element类,代表一个有限元素。我还从此类创建一个对象数组,并将其分配给Mesh的element属性。到目前为止还很清楚。
由于有限元节点也属于元素,因此我想将某些节点分配给适当的元素。但是复制节点会导致数据冗余,因此我想将指针分配给Node对象,以便Element的localNodes属性包含指向特定节点的指针数组。我应该如何修改下面的类以实现它?
该节点类:
classdef Node
properties
coordinate;
end
methods
% Not interesting for this example
end
end
该元件类:
classdef Element
properties
localNodes; % the object instantiated from the class Element
% will store an array of pointers to the
% appropriate elements of the object array stored
% in Mesh.nodes. How can I assign these pointers
% to Element.localNodes?
end
methods
% Not interesting for this example
end
end
该网类:
classdef Mesh
properties
nodes; % its object will contain an object array of Node
elements; % its object will contain an object array of Element
end
methods
% Not interesting for this example
end
end
最后,在进行一些讨论之后,我将以一个起点解决这个问题:
classdef Node < handle
properties
coordinate;
end
methods
function obj=Node(id)
obj.coordinate=id;
end
end
end
。
classdef Mesh < handle
properties
nodes; % its object will contain an object array of Node
elements; % its object will contain an object array of Element
end
methods
function obj=Mesh(nodes,elements)
pnodes=cell(1,nodes);
for idx=1:nodes
pnodes{idx}=Node(idx);
end
obj.nodes=[pnodes{:}];
pelements=cell(1,numel(elements));
for idx=1:numel(elements)
pelements{idx}=Element(obj.nodes(elements{idx}));
end
obj.elements=[pelements{:}];
end
function non_deleted_nodes=get.nodes(obj)
%getter to return only not-deleted nodes
obj.nodes=obj.nodes(arrayfun(@isvalid,(obj.nodes)));
non_deleted_nodes=obj.nodes;
end
function non_deleted_nodes=get.elements(obj)
%getter to return only not-deleted nodes
obj.elements=obj.elements(arrayfun(@isvalid,(obj.elements)));
non_deleted_nodes=obj.elements;
end
end
end
。
classdef Element < handle
properties
localNodes; % the object instantiated from the class Element
% will store an array of pointers to the
% appropriate elements of the object array stored
% in Mesh.nodes. How can I assign these pointers
% to Element.localNodes?
end
methods
function obj=Element(localNodes)
obj.localNodes=localNodes;
end
function non_deleted_nodes=get.localNodes(obj)
%getter to return only not-deleted nodes
obj.localNodes=obj.localNodes(arrayfun(@isvalid,(obj.localNodes)));
non_deleted_nodes=obj.localNodes
end
function delete(obj)
for ix=1:numel(obj.localNodes)
%The 1 is not a typo, we will delete always the first
%element until the list is empty
obj.localNodes(1).delete();
end
delete@handle(obj);
end
end
end
最后是一个简短的演示:
m=Mesh(10,{[1,2],[2,3],[3,4]})
m.elements(1).localNodes
m.elements(1).localNodes(1).delete()
%now the node is deleted from the element and the mesh
m.elements(2).delete()
%now element 2 together with the nodes is deleted.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句