classdef
petsc-3.5.4 2015-05-23
PetscVec < PetscObject
properties
VecFromDM=0;
DM = [];
end
methods
function [obj] = SetVecfromDM(obj,value)
obj.VecFromDM = value;
end
function [obj] = SetDM(obj,DM)
obj.DM = DM;
end
function obj = PetscVec(array,flg)
if (nargin > 1)
obj.pobj = array;
return
end
comm = PETSC_COMM_SELF();
[err,obj.pobj] = calllib('libpetsc', 'VecCreate',comm ,0);PetscCHKERRQ(err);
if (nargin > 0)
err = calllib('libpetsc', 'VecSetType', obj.pobj,'seq');PetscCHKERRQ(err);
err = calllib('libpetsc', 'VecSetSizes', obj.pobj,length(array),length(array));PetscCHKERRQ(err);
idx = 0:length(array)-1;
err = calllib('libpetsc', 'VecSetValues', obj.pobj,length(idx),idx,array,Petsc.INSERT_VALUES);PetscCHKERRQ(err);
err = calllib('libpetsc', 'VecAssemblyBegin', obj.pobj);PetscCHKERRQ(err);
err = calllib('libpetsc', 'VecAssemblyEnd', obj.pobj);PetscCHKERRQ(err);
end
end
function err = SetFromOptions(obj)
err = calllib('libpetsc', 'VecSetFromOptions', obj.pobj);PetscCHKERRQ(err);
end
function err = SetType(obj,name)
err = calllib('libpetsc', 'VecSetType', obj.pobj,name);PetscCHKERRQ(err);
end
function err = SetSizes(obj,m,n)
if (nargin == 2)
n = Petsc.DECIDE;
end
err = calllib('libpetsc', 'VecSetSizes', obj.pobj,m,n);PetscCHKERRQ(err);
end
function [n,err] = GetSize(obj)
n = 0;
[err,n] = calllib('libpetsc', 'VecGetLocalSize', obj.pobj,n);PetscCHKERRQ(err);
end
function err = SetValues(obj,idx,values,insertmode)
if (ischar(idx))
[n,err] = GetSize(obj);
idx = 1:n;
end
if (nargin < 3)
values = idx;
end
if (nargin < 4)
insertmode = Petsc.INSERT_VALUES;
end
idx = idx - 1;
err = calllib('libpetsc', 'VecSetValues', obj.pobj,length(idx),idx,values,insertmode);PetscCHKERRQ(err);
end
function [values,err] = GetValues(obj,idx)
if (ischar(idx))
[n,err] = GetSize(obj);
idx = 1:n;
end
idx = idx - 1;
values = zeros(1,length(idx));
[err,idx,values] = calllib('libpetsc', 'VecGetValues', obj.pobj,length(idx),idx,values);PetscCHKERRQ(err);
values = values';
end
function err = AssemblyBegin(obj)
err = calllib('libpetsc', 'VecAssemblyBegin', obj.pobj);PetscCHKERRQ(err);
end
function err = AssemblyEnd(obj)
err = calllib('libpetsc', 'VecAssemblyEnd', obj.pobj);PetscCHKERRQ(err);
end
function [vec,err] = Duplicate(obj)
[err,pid] = calllib('libpetsc', 'VecDuplicate', obj.pobj,0);PetscCHKERRQ(err);
vec = PetscVec(pid,'pobj');
end
function err = Copy(obj,v)
err = calllib('libpetsc', 'VecCopy', obj.pobj,v.pobj);PetscCHKERRQ(err);
end
function err = Set(obj,v)
err = calllib('libpetsc', 'VecSet', obj.pobj,v);PetscCHKERRQ(err);
end
function err = View(obj,viewer)
if (nargin == 1)
err = calllib('libpetsc', 'VecView', obj.pobj,0);PetscCHKERRQ(err);
else
err = calllib('libpetsc', 'VecView', obj.pobj,viewer.pobj);PetscCHKERRQ(err);
end
end
function err = Destroy(obj)
err = calllib('libpetsc', 'VecDestroy', obj.pobj);PetscCHKERRQ(err);
end
function varargout = subsref(obj,S)
if (S(1).type == '.')
[varargout{1:nargout}] = builtin('subsref', obj, S);
else
if (obj.VecFromDM)
varargout = {obj.GetValues_DM(S)};
else
varargout = {obj.GetValues(S.subs{1})};
end
end
end
function varargout = GetValues_DM(obj,S)
M = obj.DM.M; N = obj.DM.N; P = obj.DM.P;
ndim = obj.DM.ndim;
if (ndim == 1)
idx = S.subs{1};
elseif (ndim == 2)
idx = M*(S.subs{2}-1) + S.subs{1};
elseif (ndim == 3)
idx = N*M(S.subs{3}-1) + M*(S.subs{2}-1) + S.subs{1};
end
varargout = {obj.GetValues(idx)};
end
function obj = subsasgn(obj,S,value)
if (S(1).type ~= '.')
if (obj.VecFromDM)
[obj] = obj.SetValues_DM(S,value);
else
obj.SetValues(S.subs{1},value);
end
end
end
function [obj] = SetValues_DM(obj,S,value)
M = obj.DM.M; N = obj.DM.N; P = obj.DM.P;
ndim = obj.DM.ndim;
if (ndim == 1)
idx = S.subs{1};
elseif (ndim == 2)
idx = M*(S.subs{2}-1) + S.subs{1};
elseif (ndim == 3)
idx = N*M(S.subs{3}-1) + M*(S.subs{2}-1) + S.subs{1};
end
obj.SetValues(idx,value);
end
end
end