1 /* 2 * Allocate space for a block matrix. Get strucutre info from A, and 3 * allocate the matrix B with matching structure. 4 */ 5 6 7 #include <stdlib.h> 8 #include <stdio.h> 9 #include "declarations.h" 10 alloc_mat(A,pB)11void alloc_mat(A,pB) 12 struct blockmatrix A; 13 struct blockmatrix *pB; 14 { 15 int blk; 16 17 /* 18 * First put up the number of blocks. 19 */ 20 pB->nblocks=A.nblocks; 21 22 /* 23 * Then allocate space for the block records. 24 */ 25 26 pB->blocks=(struct blockrec *)malloc(sizeof(struct blockrec)*(A.nblocks+1)); 27 if (pB->blocks == NULL) 28 { 29 printf("Storage allocation failed!\n"); 30 exit(205); 31 }; 32 /* 33 * Now, fill in the info for each block. 34 */ 35 36 for (blk=1; blk <=A.nblocks; blk++) 37 { 38 pB->blocks[blk].blockcategory=A.blocks[blk].blockcategory; 39 pB->blocks[blk].blocksize=A.blocks[blk].blocksize; 40 switch (A.blocks[blk].blockcategory) 41 { 42 case DIAG: 43 pB->blocks[blk].data.vec=(double *)malloc(sizeof(double)*(A.blocks[blk].blocksize+1)); 44 if (pB->blocks[blk].data.vec == NULL) 45 { 46 printf("Storage allocation failed!\n"); 47 exit(205); 48 }; 49 break; 50 case MATRIX: 51 pB->blocks[blk].data.mat=(double *)malloc(sizeof(double)*(A.blocks[blk].blocksize)*(A.blocks[blk].blocksize)); 52 if (pB->blocks[blk].data.mat == NULL) 53 { 54 printf("Storage allocation failed!\n"); 55 exit(205); 56 }; 57 break; 58 default: 59 printf("alloc_mat illegal block type!\n"); 60 exit(206); 61 }; 62 }; 63 } 64 65 free_mat(A)66void free_mat(A) 67 struct blockmatrix A; 68 { 69 int blk; 70 71 72 /* 73 * First, free the space for each block. 74 */ 75 76 for (blk=1; blk <=A.nblocks; blk++) 77 { 78 switch (A.blocks[blk].blockcategory) 79 { 80 case DIAG: 81 free(A.blocks[blk].data.vec); 82 break; 83 case MATRIX: 84 free(A.blocks[blk].data.mat); 85 break; 86 default: 87 printf("free_mat illegal block type!\n"); 88 exit(206); 89 }; 90 }; 91 92 /* 93 * Then free space for the block records. 94 */ 95 96 free(A.blocks); 97 98 } 99 100