/[escript]/trunk/paso/src/SystemMatrix_saveMM.c
ViewVC logotype

Annotation of /trunk/paso/src/SystemMatrix_saveMM.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2551 - (hide annotations)
Thu Jul 23 09:19:15 2009 UTC (10 years, 2 months ago) by gross
File MIME type: text/plain
File size: 4933 byte(s)
a problem with the sparse matrix unrolling fixed.
1 ksteube 1312
2     /*******************************************************
3 ksteube 1811 *
4 jfenwick 2548 * Copyright (c) 2003-2009 by University of Queensland
5 ksteube 1811 * 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 dhawcroft 631
14 ksteube 1811
15 jgs 150 /**************************************************************/
16    
17     /* Paso: SystemMatrix is saved to Matrix Market format */
18    
19     /**************************************************************/
20    
21     /* Copyrights by ACcESS Australia 2003,2004 */
22     /* Author: davies@access.edu.au */
23    
24     /**************************************************************/
25    
26     #include "SystemMatrix.h"
27 gross 1369 #include "mmio.h"
28 jgs 150
29     void Paso_SystemMatrix_saveMM(Paso_SystemMatrix * A_p, char * fileName_p) {
30 gross 1028 FILE * fileHandle_p = NULL;
31 gross 1369 dim_t N,M,i, iptr_ij;
32     MM_typecode matcode;
33 jgs 150
34 ksteube 1312 if (A_p->mpi_info->size > 1) {
35 gross 1369 Paso_setError(TYPE_ERROR,"Paso_SystemMatrix_saveMM: currently single processor runs are supported.\n");
36 ksteube 1312 return;
37     }
38 artak 1780 if (A_p->col_block_size !=A_p->row_block_size) {
39     Paso_setError(TYPE_ERROR, "Paso_SystemMatrix_saveMM: currently only square blocks are supported.");
40     return;
41     }
42     if (A_p->row_block_size>3) {
43     Paso_setError(TYPE_ERROR,"Paso_SystemMatrix_saveMM: currently only block size 3 is supported.\n");
44 gross 1369 return;
45     }
46    
47 gross 415 if (A_p->type & MATRIX_FORMAT_SYM) {
48     Paso_setError(TYPE_ERROR,"Paso_SystemMatrix_saveMM does not support symmetric storage scheme");
49     return;
50     }
51 jgs 150 /* open the file */
52 gross 1028 fileHandle_p = fopen(fileName_p, "w");
53 jgs 150 if (fileHandle_p==NULL) {
54     Paso_setError(IO_ERROR,"file could not be opened for writing");
55     return;
56     }
57 gross 415 if (A_p->type & MATRIX_FORMAT_CSC) {
58 gross 1369 Paso_setError(TYPE_ERROR,"Paso_SystemMatrix_saveMM does not support CSC yet.");
59     } else {
60     mm_initialize_typecode(&matcode);
61     mm_set_matrix(&matcode);
62     mm_set_coordinate(&matcode);
63     mm_set_real(&matcode);
64    
65 gross 2551 N=Paso_SystemMatrix_getGlobalNumRows(A_p);
66 gross 1369 M=Paso_SystemMatrix_getGlobalNumCols(A_p);
67     mm_write_banner(fileHandle_p, matcode);
68 artak 1780 mm_write_mtx_crd_size(fileHandle_p, N*A_p->row_block_size, M*A_p->col_block_size, A_p->mainBlock->pattern->ptr[N]*A_p->block_size);
69     if(A_p->row_block_size==1)
70     for (i=0; i<N; i++)
71     for (iptr_ij=A_p->mainBlock->pattern->ptr[i];iptr_ij<A_p->mainBlock->pattern->ptr[i+1]; ++iptr_ij) {
72     fprintf(fileHandle_p, "%d %d %25.15e\n", i+1, A_p->mainBlock->pattern->index[iptr_ij]+1, A_p->mainBlock->val[iptr_ij]);
73     }
74 gross 1369
75 artak 1780 if(A_p->row_block_size==2)
76     for (i=0; i<N; i++) {
77     for (iptr_ij=A_p->mainBlock->pattern->ptr[i];iptr_ij<A_p->mainBlock->pattern->ptr[i+1]; ++iptr_ij) {
78     fprintf(fileHandle_p, "%d %d %25.15e\n", i*2+1, 2*(A_p->mainBlock->pattern->index[iptr_ij])+1, A_p->mainBlock->val[iptr_ij*4]);
79     fprintf(fileHandle_p, "%d %d %25.15e\n", i*2+1, 2*(A_p->mainBlock->pattern->index[iptr_ij])+1+1, A_p->mainBlock->val[iptr_ij*4+2]);
80     fprintf(fileHandle_p, "%d %d %25.15e\n", i*2+1+1, 2*(A_p->mainBlock->pattern->index[iptr_ij])+1, A_p->mainBlock->val[iptr_ij*4+1]);
81     fprintf(fileHandle_p, "%d %d %25.15e\n", i*2+1+1, 2*(A_p->mainBlock->pattern->index[iptr_ij])+1+1, A_p->mainBlock->val[iptr_ij*4+3]);
82     }
83     }
84    
85     if(A_p->row_block_size==3)
86     for (i=0; i<N; i++) {
87 gross 1369 for (iptr_ij=A_p->mainBlock->pattern->ptr[i];iptr_ij<A_p->mainBlock->pattern->ptr[i+1]; ++iptr_ij) {
88 artak 1780 fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1, A_p->mainBlock->val[iptr_ij*9]);
89     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1+1, A_p->mainBlock->val[iptr_ij*9+3]);
90     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+2+1, A_p->mainBlock->val[iptr_ij*9+6]);
91     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1, A_p->mainBlock->val[iptr_ij*9+1]);
92     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1+1, A_p->mainBlock->val[iptr_ij*9+4]);
93     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+1+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+2+1, A_p->mainBlock->val[iptr_ij*9+7]);
94     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+2+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1, A_p->mainBlock->val[iptr_ij*9+2]);
95     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+2+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+1+1, A_p->mainBlock->val[iptr_ij*9+5]);
96     fprintf(fileHandle_p, "%d %d %25.15e\n", i*3+2+1, 3*(A_p->mainBlock->pattern->index[iptr_ij])+2+1, A_p->mainBlock->val[iptr_ij*9+8]);
97     }
98     }
99    
100 jgs 150 }
101    
102     /* close the file */
103     fclose(fileHandle_p);
104    
105     return;
106     }

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26