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