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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 971 - (hide annotations)
Wed Feb 14 04:40:49 2007 UTC (12 years, 9 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 jgs 150 /* $Id$ */
2    
3 dhawcroft 631 /*
4     ********************************************************************************
5 dhawcroft 633 * Copyright 2006 by ACcESS MNRF *
6 dhawcroft 631 * *
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 jgs 150 /**************************************************************/
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 ksteube 971 Paso_SystemMatrixPattern* Paso_SystemMatrixPattern_alloc(int type, int n_ptr, index_t* ptr,index_t* index) {
33 jgs 150 Paso_SystemMatrixPattern*out;
34 gross 415 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 jgs 150 dim_t i;
37     Paso_resetError();
38    
39 gross 415 if (type & PATTERN_FORMAT_SYM) {
40     Paso_setError(TYPE_ERROR,"symmetric matrix pattern is not supported yet");
41     return NULL;
42     }
43 jgs 150 #pragma omp parallel private(loc_min_index,loc_max_index,i)
44 gross 415 {
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 gross 425 loc_max_index=MAX(loc_max_index,index[ptr[i+1]-2]);
54 gross 415 }
55 jgs 150 }
56 gross 415 } else {
57     #pragma omp for schedule(static)
58     for (i=0;i<n_ptr;++i) {
59     if (ptr[i]<ptr[i+1]) {
60 woo409 757 #ifdef USE_QSORTG
61     qsortG(&(index[ptr[i]]),(size_t)(ptr[i+1]-ptr[i]),sizeof(index_t),Paso_comparIndex);
62     #else
63 gross 415 qsort(&(index[ptr[i]]),(size_t)(ptr[i+1]-ptr[i]),sizeof(index_t),Paso_comparIndex);
64 woo409 757 #endif
65 gross 415 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 jgs 150 }
76 gross 415 if (min_index<index_offset) {
77 jgs 150 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 gross 425 out->n_index=max_index-index_offset+1;
85 jgs 150 out->ptr=ptr;
86     out->index=index;
87 gross 425 out->len=out->ptr[out->n_ptr]-index_offset;
88 jgs 150 out->reference_counter=1;
89 gross 415 out->type=type;
90 jgs 150 #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