1 |
|
2 |
/******************************************************* |
3 |
* |
4 |
* Copyright (c) 2003-2008 by University of Queensland |
5 |
* Earth Systems Science Computational Center (ESSCC) |
6 |
* http://www.uq.edu.au/esscc |
7 |
* |
8 |
* Primary Business: Queensland, Australia |
9 |
* Licensed under the Open Software License version 3.0 |
10 |
* http://www.opensource.org/licenses/osl-3.0.php |
11 |
* |
12 |
*******************************************************/ |
13 |
|
14 |
|
15 |
/**************************************************************/ |
16 |
|
17 |
/* Paso: SystemMatrixPattern_unrollBlocks */ |
18 |
|
19 |
/**************************************************************/ |
20 |
|
21 |
/* Author: gross@access.edu.au */ |
22 |
|
23 |
/**************************************************************/ |
24 |
|
25 |
#include "SystemMatrixPattern.h" |
26 |
|
27 |
/**************************************************************/ |
28 |
|
29 |
/* creates SystemMatrixPattern */ |
30 |
|
31 |
Paso_SystemMatrixPattern* Paso_SystemMatrixPattern_unrollBlocks(Paso_SystemMatrixPattern* pattern, |
32 |
int type, dim_t output_block_size,dim_t input_block_size) { |
33 |
Paso_SystemMatrixPattern*out=NULL; |
34 |
Paso_Pattern *new_mainPattern=NULL, *new_col_couplePattern=NULL, *new_row_couplePattern=NULL; |
35 |
Paso_Distribution* new_output_distribution=NULL, *new_input_distribution=NULL; |
36 |
Paso_Connector *new_col_connector=NULL, *new_row_connector=NULL; |
37 |
|
38 |
new_mainPattern=Paso_Pattern_unrollBlocks(pattern->mainPattern,type,output_block_size,input_block_size); |
39 |
new_col_couplePattern=Paso_Pattern_unrollBlocks(pattern->col_couplePattern,type,output_block_size,input_block_size); |
40 |
new_row_couplePattern=Paso_Pattern_unrollBlocks(pattern->row_couplePattern,type,output_block_size,input_block_size); |
41 |
new_output_distribution=Paso_Distribution_alloc(pattern->output_distribution->mpi_info, |
42 |
pattern->output_distribution->first_component, |
43 |
output_block_size,0); |
44 |
new_input_distribution=Paso_Distribution_alloc(pattern->input_distribution->mpi_info, |
45 |
pattern->input_distribution->first_component, |
46 |
input_block_size,0); |
47 |
new_col_connector=Paso_Connector_unroll(pattern->col_connector,input_block_size); |
48 |
new_row_connector=Paso_Connector_unroll(pattern->row_connector,output_block_size); |
49 |
if (Paso_noError()) { |
50 |
out=Paso_SystemMatrixPattern_alloc(type, |
51 |
new_output_distribution, |
52 |
new_input_distribution, |
53 |
new_mainPattern, |
54 |
new_col_couplePattern, |
55 |
new_row_couplePattern, |
56 |
new_col_connector, |
57 |
new_row_connector); |
58 |
} |
59 |
Paso_Pattern_free(new_mainPattern); |
60 |
Paso_Pattern_free(new_col_couplePattern); |
61 |
Paso_Pattern_free(new_row_couplePattern); |
62 |
Paso_Distribution_free(new_output_distribution); |
63 |
Paso_Distribution_free(new_input_distribution); |
64 |
Paso_Connector_free(new_row_connector); |
65 |
Paso_Connector_free(new_col_connector); |
66 |
|
67 |
if (Paso_noError()) { |
68 |
return out; |
69 |
} else { |
70 |
Paso_SystemMatrixPattern_free(out); |
71 |
return NULL; |
72 |
} |
73 |
} |