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

Contents of /trunk/paso/src/SystemMatrixPattern.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 971 - (show annotations)
Wed Feb 14 04:40:49 2007 UTC (12 years, 6 months ago) by ksteube
File MIME type: text/plain
File size: 4900 byte(s)
Had to undo commit to new MPI branch. The changes went into the original and
not the branch. The files committed here are exactly the same as revision 969.


1 /* $Id$ */
2
3 /*
4 ********************************************************************************
5 * Copyright 2006 by ACcESS MNRF *
6 * *
7 * http://www.access.edu.au *
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 /* Paso: SystemMatrixPatternPattern */
17
18 /**************************************************************/
19
20 /* Copyrights by ACcESS Australia 2003, 2004,2005 */
21 /* Author: gross@access.edu.au */
22
23 /**************************************************************/
24
25 #include "Paso.h"
26 #include "SystemMatrixPattern.h"
27
28 /**************************************************************/
29
30 /* allocates a SystemMatrixPattern */
31
32 Paso_SystemMatrixPattern* Paso_SystemMatrixPattern_alloc(int type, int n_ptr, index_t* ptr,index_t* index) {
33 Paso_SystemMatrixPattern*out;
34 index_t index_offset=(type & PATTERN_FORMAT_OFFSET1 ? 1:0);
35 index_t loc_min_index,loc_max_index,min_index=index_offset,max_index=index_offset-1;
36 dim_t i;
37 Paso_resetError();
38
39 if (type & PATTERN_FORMAT_SYM) {
40 Paso_setError(TYPE_ERROR,"symmetric matrix pattern is not supported yet");
41 return NULL;
42 }
43 #pragma omp parallel private(loc_min_index,loc_max_index,i)
44 {
45 loc_min_index=index_offset;
46 loc_max_index=index_offset-1;
47 if (type & PATTERN_FORMAT_OFFSET1) {
48 #pragma omp for schedule(static)
49 for (i=0;i<n_ptr;++i) {
50 if (ptr[i]<ptr[i+1]) {
51 qsort(&(index[ptr[i]-1]),(size_t)(ptr[i+1]-ptr[i]),sizeof(index_t),Paso_comparIndex);
52 loc_min_index=MIN(loc_min_index,index[ptr[i]-1]);
53 loc_max_index=MAX(loc_max_index,index[ptr[i+1]-2]);
54 }
55 }
56 } else {
57 #pragma omp for schedule(static)
58 for (i=0;i<n_ptr;++i) {
59 if (ptr[i]<ptr[i+1]) {
60 #ifdef USE_QSORTG
61 qsortG(&(index[ptr[i]]),(size_t)(ptr[i+1]-ptr[i]),sizeof(index_t),Paso_comparIndex);
62 #else
63 qsort(&(index[ptr[i]]),(size_t)(ptr[i+1]-ptr[i]),sizeof(index_t),Paso_comparIndex);
64 #endif
65 loc_min_index=MIN(loc_min_index,index[ptr[i]]);
66 loc_max_index=MAX(loc_max_index,index[ptr[i+1]-1]);
67 }
68 }
69 }
70 #pragma omp critical
71 {
72 min_index=MIN(loc_min_index,min_index);
73 max_index=MAX(loc_max_index,max_index);
74 }
75 }
76 if (min_index<index_offset) {
77 Paso_setError(TYPE_ERROR,"Matrix pattern index out of range.");
78 return NULL;
79 }
80
81 out=MEMALLOC(1,Paso_SystemMatrixPattern);
82 if (Paso_checkPtr(out)) return NULL;
83 out->n_ptr=n_ptr;
84 out->n_index=max_index-index_offset+1;
85 out->ptr=ptr;
86 out->index=index;
87 out->len=out->ptr[out->n_ptr]-index_offset;
88 out->reference_counter=1;
89 out->type=type;
90 #ifdef Paso_TRACE
91 printf("Paso_SystemMatrixPattern_dealloc: system matrix pattern as been allocated.\n");
92 #endif
93 return out;
94 }
95
96 /* returns a reference to in */
97
98 Paso_SystemMatrixPattern* Paso_SystemMatrixPattern_reference(Paso_SystemMatrixPattern* in) {
99 if (in!=NULL) {
100 ++(in->reference_counter);
101 }
102 return in;
103 }
104
105 /* deallocates a SystemMatrixPattern: */
106
107 void Paso_SystemMatrixPattern_dealloc(Paso_SystemMatrixPattern* in) {
108 if (in!=NULL) {
109 in->reference_counter--;
110 if (in->reference_counter<=0) {
111 MEMFREE(in->ptr);
112 MEMFREE(in->index);
113 MEMFREE(in);
114 #ifdef Paso_TRACE
115 printf("Paso_SystemMatrixPattern_dealloc: system matrix pattern as been deallocated.\n");
116 #endif
117 }
118 }
119 }
120 /* *************************************************************/
121
122 /* some routines which help to get the matrix pattern from elements: */
123
124 /* this routine is used by qsort called in Paso_SystemMatrixPattern_alloc */
125
126 int Paso_comparIndex(const void *index1,const void *index2){
127 index_t Iindex1,Iindex2;
128 Iindex1=*(index_t*)index1;
129 Iindex2=*(index_t*)index2;
130 if (Iindex1<Iindex2) {
131 return -1;
132 } else {
133 if (Iindex1>Iindex2) {
134 return 1;
135 } else {
136 return 0;
137 }
138 }
139 }
140 /*
141 * $Log$
142 * Revision 1.2 2005/09/15 03:44:38 jgs
143 * Merge of development branch dev-02 back to main trunk on 2005-09-15
144 *
145 * Revision 1.1.2.1 2005/09/05 06:29:47 gross
146 * These files have been extracted from finley to define a stand alone libray for iterative
147 * linear solvers on the ALTIX. main entry through Paso_solve. this version compiles but
148 * has not been tested yet.
149 *
150 *
151 */

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.26