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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1628 - (hide annotations)
Fri Jul 11 13:12:46 2008 UTC (11 years, 7 months ago) by phornby
File MIME type: text/plain
File size: 6483 byte(s)

Merge in /branches/windows_from_1456_trunk_1620_merged_in branch.

You will find a preserved pre-merge trunk in tags under tags/trunk_at_1625.
That will be useful for diffing & checking on my stupidity.

Here is a list of the conflicts and their resolution at this
point in time.


=================================================================================
(LLWS == looks like white space).

finley/src/Assemble_addToSystemMatrix.c - resolve to branch - unused var. may be wrong.....
finley/src/CPPAdapter/SystemMatrixAdapter.cpp - resolve to branch - LLWS
finley/src/CPPAdapter/MeshAdapter.cpp - resolve to branch - LLWS
paso/src/PCG.c - resolve to branch - unused var fixes.
paso/src/SolverFCT.c - resolve to branch - LLWS
paso/src/FGMRES.c - resolve to branch - LLWS
paso/src/Common.h - resolve to trunk version. It's omp.h's include... not sure it's needed,
but for the sake of saftey.....
paso/src/Functions.c - resolve to branch version, indentation/tab removal and return error
on bad unimplemented Paso_FunctionCall.
paso/src/SolverFCT_solve.c - resolve to branch version, unused vars
paso/src/SparseMatrix_MatrixVector.c - resolve to branch version, unused vars.
escript/src/Utils.cpp - resloved to branch, needs WinSock2.h
escript/src/DataExpanded.cpp - resolved to branch version - LLWS
escript/src/DataFactory.cpp - resolve to branch version
=================================================================================

This currently passes tests on linux (debian), but is not checked on windows or Altix yet.

This checkin is to make a trunk I can check out for windows to do tests on it.

Known outstanding problem is in the operator=() method of exceptions
causing warning messages on the intel compilers.

May the God of doughnuts have mercy on my soul.


1 gross 1361 /* $Id:$ */
2    
3     /*******************************************************
4     *
5     * Copyright 2007 by University of Queensland
6     *
7     * http://esscc.uq.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 gross 1362 /* Paso: FCTransportProblem */
17 gross 1361
18     /**************************************************************/
19    
20     /* Author: l.gross@uq.edu.au */
21    
22     /**************************************************************/
23    
24    
25     #include "Paso.h"
26     #include "SolverFCT.h"
27     #include "PasoUtil.h"
28    
29    
30 gross 1362 /**************************************************************/
31 gross 1361
32 gross 1362 /* free all memory used by */
33     void Paso_FCTransportProblem_free(Paso_FCTransportProblem* in) {
34     if (in!=NULL) {
35     in->reference_counter--;
36     if (in->reference_counter<=0) {
37     Paso_SystemMatrix_free(in->transport_matrix);
38 gross 1407 Paso_SystemMatrix_free(in->mass_matrix);
39     Paso_SystemMatrix_free(in->iteration_matrix);
40 gross 1362 Paso_MPIInfo_free(in->mpi_info);
41 gross 1364 MEMFREE(in->u);
42 gross 1562 Paso_Coupler_free(in->u_coupler);
43 gross 1407 MEMFREE(in->main_iptr);
44 gross 1362 MEMFREE(in->lumped_mass_matrix);
45 gross 1407 MEMFREE(in->main_diagonal_low_order_transport_matrix);
46 gross 1362 MEMFREE(in);
47     }
48     }
49     }
50 gross 1361
51 gross 1362 Paso_FCTransportProblem* Paso_FCTransportProblem_getReference(Paso_FCTransportProblem* in) {
52 gross 1361 if (in!=NULL) {
53 gross 1362 ++(in->reference_counter);
54 gross 1361 }
55 gross 1367 return in;
56 gross 1362 }
57    
58     Paso_SystemMatrix* Paso_FCTransportProblem_borrowTransportMatrix(Paso_FCTransportProblem* in) {
59     return in->transport_matrix;
60 gross 1361 }
61 gross 1407 Paso_SystemMatrix* Paso_FCTransportProblem_borrowMassMatrix(Paso_FCTransportProblem* in) {
62     return in->mass_matrix;
63 gross 1362 }
64 gross 1361
65 gross 1362 double* Paso_FCTransportProblem_borrowLumpedMassMatrix(Paso_FCTransportProblem* in) {
66     return in->lumped_mass_matrix;
67     }
68 gross 1361
69 gross 1362 dim_t Paso_FCTransportProblem_getTotalNumRows(Paso_FCTransportProblem* in) {
70     return Paso_SystemMatrix_getTotalNumRows(in->transport_matrix);
71     }
72 gross 1361
73 gross 1407 Paso_FCTransportProblem* Paso_FCTransportProblem_alloc(double theta, Paso_SystemMatrixPattern *pattern, int block_size
74 gross 1361
75 gross 1362
76     ) {
77     Paso_SystemMatrixType matrix_type=MATRIX_FORMAT_DEFAULT+MATRIX_FORMAT_BLK1; /* at the moment only block size 1 is supported */
78     Paso_FCTransportProblem* out=NULL;
79     dim_t n,i;
80 phornby 1628 index_t iptr,iptr_main;
81 gross 1362
82     if ((theta<0.) || (theta >1.)) {
83     Paso_setError(TYPE_ERROR,"Paso_FCTransportProblem_alloc: theta needs to be between 0. and. 1.");
84 gross 1361 return NULL;
85 gross 1362 }
86 gross 1361
87 gross 1362 out=MEMALLOC(1,Paso_FCTransportProblem);
88     if (Paso_checkPtr(out)) return NULL;
89 gross 1361
90 gross 1407
91 gross 1362 out->theta=theta;
92 gross 1407 out->dt_max=LARGE_POSITIVE_FLOAT;
93 gross 1363 out->valid_matrices=FALSE;
94 gross 1362 out->transport_matrix=Paso_SystemMatrix_alloc(matrix_type,pattern,block_size,block_size);
95 gross 1407 out->mass_matrix=Paso_SystemMatrix_alloc(matrix_type,pattern,block_size,block_size);
96     out->iteration_matrix=NULL;
97     out->u=NULL;
98 gross 1562 out->u_coupler=Paso_Coupler_alloc(pattern->col_connector,block_size);
99 gross 1407 out->u_min=0.;
100 gross 1562 out->mpi_info=Paso_MPIInfo_getReference(pattern->mpi_info);
101 gross 1362 out->main_iptr=NULL;
102     out->lumped_mass_matrix=NULL;
103 gross 1407 out->main_diagonal_low_order_transport_matrix=NULL;
104 gross 1361
105 gross 1362 if (Paso_noError()) {
106     n=Paso_SystemMatrix_getTotalNumRows(out->transport_matrix);
107    
108 gross 1407 out->u=MEMALLOC(n,double);
109 gross 1362 out->main_iptr=MEMALLOC(n,index_t);
110     out->lumped_mass_matrix=MEMALLOC(n,double);
111 gross 1407 out->main_diagonal_low_order_transport_matrix=MEMALLOC(n,double);
112 gross 1362
113 gross 1407 if ( ! (Paso_checkPtr(out->u) || Paso_checkPtr(out->main_iptr) ||
114     Paso_checkPtr(out->lumped_mass_matrix) || Paso_checkPtr(out->main_diagonal_low_order_transport_matrix)) ) {
115 gross 1362
116 gross 1562 #pragma omp parallel
117     {
118     #pragma omp for schedule(static) private(i)
119     for (i = 0; i < n; ++i) {
120     out->lumped_mass_matrix[i]=0.;
121     out->main_diagonal_low_order_transport_matrix[i]=0.;
122     out->u[i]=0.;
123     }
124     /* identify the main diagonals */
125 phornby 1628 #pragma omp for schedule(static) private(i,iptr,iptr_main)
126 gross 1562 for (i = 0; i < n; ++i) {
127     iptr_main=pattern->mainPattern->ptr[0]-1;
128     for (iptr=pattern->mainPattern->ptr[i];iptr<pattern->mainPattern->ptr[i+1]; iptr++) {
129     if (pattern->mainPattern->index[iptr]==i) {
130     iptr_main=iptr;
131     break;
132     }
133     }
134     out->main_iptr[i]=iptr_main;
135     if (iptr_main==pattern->mainPattern->ptr[0]-1)
136     Paso_setError(VALUE_ERROR, "Paso_FCTransportProblem_alloc: no main diagonal");
137     }
138    
139 gross 1367 }
140 gross 1362 }
141    
142 gross 1361 }
143     if (Paso_noError()) {
144     return out;
145     } else {
146 gross 1362 Paso_FCTransportProblem_free(out);
147 gross 1361 return NULL;
148     }
149     }
150 gross 1364
151     void Paso_FCTransportProblem_checkinSolution(Paso_FCTransportProblem* in, double* u) {
152     dim_t i, n;
153 gross 1407 double local_u_min,u_min;
154 gross 1562 n=Paso_FCTransportProblem_getTotalNumRows(in);
155 gross 1364
156 gross 1407 u_min=LARGE_POSITIVE_FLOAT;
157     #pragma omp parallel private(local_u_min)
158     {
159     local_u_min=0.;
160     #pragma omp for schedule(static) private(i)
161 gross 1410 for (i=0;i<n;++i) local_u_min=MIN(local_u_min,u[i]);
162 gross 1407 #pragma omp critical
163     {
164     u_min=MIN(u_min,local_u_min);
165     }
166 gross 1364 }
167 gross 1407 #ifdef PASO_MPI
168     local_u_min=u_min;
169 ksteube 1415 MPI_Allreduce(&local_u_min,&u_min, 1, MPI_DOUBLE, MPI_MIN, in->mpi_info->comm);
170 gross 1407 #endif
171 gross 1562 in->u_min=u_min*0;
172 gross 1410 #pragma omp parallel for schedule(static) private(i)
173     for (i=0;i<n;++i) {
174 gross 1562 in->u[i]=u[i]-(in->u_min);
175 gross 1410 }
176 gross 1562 Paso_Coupler_startCollect(in->u_coupler,in->u);
177     Paso_Coupler_finishCollect(in->u_coupler);
178 gross 1364 }
179 gross 1562 dim_t Paso_FCTransportProblem_getBlockSize(const Paso_FCTransportProblem* in)
180     {
181     return in->transport_matrix->row_block_size;
182     }
183    
184     Paso_Connector* Paso_FCTransportProblem_borrowConnector(const Paso_FCTransportProblem* in)
185     {
186     return in->transport_matrix->pattern->col_connector;
187     }

  ViewVC Help
Powered by ViewVC 1.1.26