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)11 void 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)66 void 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