Actual source code: generatePetscTestFiles.m

petsc-3.12.1 2019-10-22
Report Typos and Errors
  1: % This MATLAB script generates test matrices for PETSc
  2: % using PETSc-MATLAB IO functions and the function laplacian.m from
  3: % http://www.mathworks.com/matlabcentral/fileexchange/27279-laplacian-in-1d-2d-or-3d


  6: clear all;
  7: nx=3; ny=4; n=nx*ny; % any sizes can be used
  8: % Create a nx-times-ny 2D negative Laplacian with h=1 and Dirichlet BC
  9: [~,~,A]=laplacian([nx,ny],{'DD' 'DD'});
 10: % Alternatevely, a nx-times-ny-times-nz 3D negative Laplacian with h=1 and Dirichlet BC
 11: %nz=2; n=nx*ny*nz; [~,~,A]=laplacian([nx,ny,nz],{'DD' 'DD' 'DD'});

 13: x=ones(n,1); b=A*x; %  use VecSet(x,1.0) in PETSc for x

 15: % this is the default
 16: PetscBinaryWrite('spd-real-int32-float64',A,b, 'indices','int32','precision','float64');
 17: [At,bt] = PetscBinaryRead('spd-real-int32-float64', 'indices','int32','precision','float64');
 18: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 19:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 20:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for spd-real-int32-float64');
 21: end

 23: % int64 only appears in the header
 24: PetscBinaryWrite('spd-real-int64-float64',A, b,'indices','int64','precision','float64');
 25: [At,bt] = PetscBinaryRead('spd-real-int64-float64','indices','int64','precision','float64');
 26: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 27:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 28:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for spd-real-int64-float64');
 29: end

 31: % MATLAB does not yet support single-presision sparce matrices
 32: % but all the entries in A, b, and x are actually integers
 33: PetscBinaryWrite('spd-real-int32-float32',A,b, 'indices','int32','precision','float32');
 34: [At,bt] = PetscBinaryRead('spd-real-int32-float32', 'indices','int32','precision','float32');
 35: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 36:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 37:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for spd-real-int32-float32');
 38: end

 40: % int64 only appears in the header
 41: PetscBinaryWrite('spd-real-int64-float32',A,b,'indices','int64','precision','float32');
 42: [At,bt] = PetscBinaryRead('spd-real-int64-float32','indices','int64','precision','float32');
 43: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 44:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 45:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for spd-real-int64-float32');
 46: end
 47: 
 48: % Now, we swap the (1,1) and (1,2) entries in A to make it nonsymmetric
 49: tmp=A(1,1); A(1,1)=A(1,2); A(1,2)=tmp; clear tmp;
 50: % the solution x does not change and can be reused. Check:
 51: if max(abs(b-A*x))  ~= 0
 52:  error('PETSc:generatePetscTestFiles:WrongAns',...
 53:  '%s','The nonsymmetric matrix A is wrong');
 54: end

 56: % We need to again write all possible formats
 57: PetscBinaryWrite('ns-real-int32-float64',A,b,'indices','int32','precision','float64');
 58: [At,bt] = PetscBinaryRead('ns-real-int32-float64','indices','int32','precision','float64');
 59: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 60:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 61:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for ns-real-int32-float64');
 62: end
 63: PetscBinaryWrite('ns-real-int64-float64',A,b,'indices','int64','precision','float64');
 64: [At,bt] = PetscBinaryRead('ns-real-int64-float64','indices','int64','precision','float64');
 65: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 66:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 67:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for ns-real-int64-float64');
 68: end
 69: PetscBinaryWrite('ns-real-int32-float32',A,b,'indices','int32','precision','float32');
 70: [At,bt] = PetscBinaryRead('ns-real-int32-float32','indices','int32','precision','float32');
 71: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 72:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 73:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for ns-real-int32-float32');
 74: end
 75: PetscBinaryWrite('ns-real-int64-float32',A,b,'indices','int64','precision','float32');
 76: [At,bt] = PetscBinaryRead('ns-real-int64-float32','indices','int64','precision','float32');
 77: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 78:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 79:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for ns-real-int64-float32');
 80: end

 82: % Finally, we make A, b, and x complex, still integers
 83: A(1,1)=A(1,1)+1i; A(2,1)=A(2,1)-1i;
 84: x=1i.*ones(n,1); b=A*x;  % use VecSet(x,PETSC_i) in PETSc for x

 86: % We need to again write all possible formats
 87: PetscBinaryWrite('nh-complex-int32-float64',A,b,'indices','int32','precision','float64');
 88: [At,bt] = PetscBinaryRead('nh-complex-int32-float64','indices','int32','precision','float64','complex',true);
 89: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 90:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 91:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for nh-complex-int32-float64');
 92: end
 93: PetscBinaryWrite('nh-complex-int64-float64',A,b,'indices','int64','precision','float64');
 94: [At,bt] = PetscBinaryRead('nh-complex-int64-float64','indices','int64','precision','float64','complex',true);
 95: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
 96:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
 97:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for nh-complex-int64-float64');
 98: end
 99: PetscBinaryWrite('nh-complex-int32-float32',A,b,'indices','int32','precision','float32');
100: [At,bt] = PetscBinaryRead('nh-complex-int32-float32','indices','int32','precision','float32','complex',true);
101: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
102:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
103:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for nh-complex-int32-float32');
104: end
105: PetscBinaryWrite('nh-complex-int64-float32',A,b,'indices','int64','precision','float32');
106: [At,bt] = PetscBinaryRead('nh-complex-int64-float32','indices','int64','precision','float32','complex',true);
107: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
108:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
109:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for nh-complex-int64-float32');
110: end

112: % Make A Hermitian, without changing b and x
113: tmp=A(1,1); A(1,1)=A(1,2); A(1,2)=tmp; clear tmp;
114: % the solution x does not change and can be reused. Check:
115: if max(max(abs(b-A*x)),max(max(abs(A-A'))))  ~= 0
116:  error('PETSc:generatePetscTestFiles:WrongAns',...
117:  '%s','The HPD matrix A is wrong');
118: end

120: % We need to again write all possible formats
121: PetscBinaryWrite('hpd-complex-int32-float64',A,b,'indices','int32','precision','float64');
122: [At,bt] = PetscBinaryRead('hpd-complex-int32-float64','indices','int32','precision','float64','complex',true);
123: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
124:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
125:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for hpd-complex-int32-float64');
126: end
127: PetscBinaryWrite('hpd-complex-int64-float64',A,b,'indices','int64','precision','float64');
128: [At,bt] = PetscBinaryRead('hpd-complex-int64-float64','indices','int64','precision','float64','complex',true);
129: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
130:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
131:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for hpd-complex-int64-float64');
132: end
133: PetscBinaryWrite('hpd-complex-int32-float32',A,b,'indices','int32','precision','float32');
134: [At,bt] = PetscBinaryRead('hpd-complex-int32-float32','indices','int32','precision','float32','complex',true);
135: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
136:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
137:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for hpd-complex-int32-float32');
138: end
139: PetscBinaryWrite('hpd-complex-int64-float32',A,b,'indices','int64','precision','float32');
140: [At,bt] = PetscBinaryRead('hpd-complex-int64-float32','indices','int64','precision','float32','complex',true);
141: if max(max(max(abs(At-A))),max(abs(bt-b))) ~= 0
142:  error('PETSc:generatePetscTestFiles:IncompatibleIO',...
143:  '%s','Error in PetscBinaryWrite or/and PetscBinaryRead for hpd-complex-int64-float32');
144: end