Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/fem/src/BackwardError.F90
3203 views
1
!/*****************************************************************************/
2
! *
3
! * Elmer, A Finite Element Software for Multiphysical Problems
4
! *
5
! * Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
6
! *
7
! * This library is free software; you can redistribute it and/or
8
! * modify it under the terms of the GNU Lesser General Public
9
! * License as published by the Free Software Foundation; either
10
! * version 2.1 of the License, or (at your option) any later version.
11
! *
12
! * This library is distributed in the hope that it will be useful,
13
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
! * Lesser General Public License for more details.
16
! *
17
! * You should have received a copy of the GNU Lesser General Public
18
! * License along with this library (in file ../LGPL-2.1); if not, write
19
! * to the Free Software Foundation, Inc., 51 Franklin Street,
20
! * Fifth Floor, Boston, MA 02110-1301 USA
21
! *
22
! *****************************************************************************/
23
!
24
25
#include "huti_fdefs.h"
26
27
!------------------------------------------------------------------------------
28
!> The normwise relative backward error err = ||b-Ax||/(||A|| ||x|| + ||b||)
29
!> where ||.|| is the 2-norm
30
!------------------------------------------------------------------------------
31
FUNCTION NormwiseBackwardError2( x,b,r,ipar,dpar ) RESULT(err)
32
!------------------------------------------------------------------------------
33
USE ParallelUtils
34
35
INTEGER :: ipar(*),n
36
DOUBLE PRECISION :: x(HUTI_NDIM),b(HUTI_NDIM),r(HUTI_NDIM),dpar(*),err
37
DOUBLE PRECISION :: res(HUTI_NDIM)
38
39
n = HUTI_NDIM
40
41
IF(ParEnv % PEs>1) THEN
42
CALL SParMatrixVector(x,res,ipar)
43
ELSE
44
CALL CRS_MatrixVectorMultiply(GlobalMatrix,x,res)
45
END IF
46
res = res - b(1:n)
47
48
err = SQRT(ParallelReduction(SUM( res(1:n)**2) )) / &
49
SQRT(ParallelReduction(SUM(GlobalMatrix % Values**2))) * &
50
SQRT(ParallelReduction(SUM(x(1:n)**2))) + &
51
SQRT(ParallelReduction((SUM(b(1:n)**2))) )
52
53
!------------------------------------------------------------------------------
54
END FUNCTION NormwiseBackwardError2
55
!------------------------------------------------------------------------------
56
57
58
!------------------------------------------------------------------------------
59
!> The normwise relative backward error err = ||r||/(||A|| ||x|| + ||b||)
60
!> where ||.|| is the supremum norm and A is assumed to be scaled such that its
61
!> norm is the unity (setting Linear System Row Equilibration = Logical True).
62
!> Here the residual r = b - Ax should be known when calling this function.
63
!------------------------------------------------------------------------------
64
FUNCTION NormwiseBackwardError( x,b,r,ipar,dpar ) RESULT(err)
65
!------------------------------------------------------------------------------
66
USE ParallelUtils
67
68
INTEGER :: ipar(*),n
69
DOUBLE PRECISION :: x(HUTI_NDIM),b(HUTI_NDIM),r(HUTI_NDIM),dpar(*),err
70
71
n = HUTI_NDIM
72
73
err = ParallelReduction(MAXVAL(ABS(r(1:n))),2) / &
74
(ParallelReduction(MAXVAL(ABS(x(1:n))),2) + &
75
ParallelReduction(MAXVAL(ABS(b(1:n))),2))
76
77
!------------------------------------------------------------------------------
78
END FUNCTION NormwiseBackwardError
79
!------------------------------------------------------------------------------
80
81
!------------------------------------------------------------------------------
82
!> The complex-valued version of the normwise relative backward error err =
83
!> ||r||/(||A|| ||x|| + ||b||) where ||.|| is the supremum norm and A is
84
!> assumed to be scaled such that its norm is the unity (setting Linear System
85
!> Row Equilibration = Logical True). Here the residual r = b - Ax should
86
!> be known when calling this function.
87
!------------------------------------------------------------------------------
88
FUNCTION NormwiseBackwardError_Z( x,b,r,ipar,dpar ) RESULT(err)
89
!------------------------------------------------------------------------------
90
USE ParallelUtils
91
IMPLICIT NONE
92
93
DOUBLE COMPLEX :: x(*),b(*),r(*)
94
INTEGER :: ipar(*)
95
DOUBLE PRECISION :: dpar(*)
96
DOUBLE PRECISION :: err
97
98
INTEGER :: n
99
100
! n = HUTI_NDIM
101
n = ipar(3)
102
103
err = ParallelReduction(MAXVAL(ABS(r(1:n))),2) / &
104
(ParallelReduction(MAXVAL(ABS(x(1:n))),2) + &
105
ParallelReduction(MAXVAL(ABS(b(1:n))),2))
106
!------------------------------------------------------------------------------
107
END FUNCTION NormwiseBackwardError_Z
108
!------------------------------------------------------------------------------
109
110
111
!------------------------------------------------------------------------------
112
!> The normwise relative backward error err = ||b-Ax||/(||A|| ||x|| + ||b||)
113
!> where ||.|| is the supremum norm. The matrix norm of A is computed within
114
!> this subroutine.
115
!------------------------------------------------------------------------------
116
FUNCTION NormwiseBackwardErrorGeneralized( x,b,r,ipar,dpar ) RESULT(err)
117
!------------------------------------------------------------------------------
118
USE ParallelUtils
119
120
INTEGER :: ipar(*),n
121
DOUBLE PRECISION :: x(HUTI_NDIM),b(HUTI_NDIM),r(HUTI_NDIM),dpar(*),err
122
DOUBLE PRECISION :: res(HUTI_NDIM)
123
DOUBLE PRECISION :: d(HUTI_NDIM), ANorm
124
125
n = HUTI_NDIM
126
127
d = 1.0d0
128
res = 0.0d0
129
IF(ParEnv % PEs>1) THEN
130
CALL SParABSMatrixVector(d,res,ipar)
131
ELSE
132
CALL CRS_ABSMatrixVectorMultiply(GlobalMatrix,d,res)
133
END IF
134
ANorm = ParallelReduction(MAXVAL(ABS(res(1:n))),2)
135
136
res = 0.0d0
137
IF(ParEnv % PEs>1) THEN
138
CALL SParMatrixVector(x,res,ipar)
139
ELSE
140
CALL CRS_MatrixVectorMultiply(GlobalMatrix,x,res)
141
END IF
142
res = res - b(1:n)
143
144
err = ParallelReduction(MAXVAL(ABS(res(1:n))),2) / &
145
(ANorm * ParallelReduction(MAXVAL(ABS(x(1:n))),2) + &
146
ParallelReduction(MAXVAL(ABS(b(1:n))),2))
147
148
!------------------------------------------------------------------------------
149
END FUNCTION NormwiseBackwardErrorGeneralized
150
!------------------------------------------------------------------------------
151
152
153
!------------------------------------------------------------------------------
154
!> The componentwise relative backward error err = max_j{|r|_j /(|A| |x| + |b|)_j}
155
!> with r the residual r = b-Ax.
156
!------------------------------------------------------------------------------
157
FUNCTION ComponentwiseBackwardError( x,b,r,ipar,dpar ) RESULT(err)
158
!------------------------------------------------------------------------------
159
USE ParallelUtils
160
161
INTEGER :: ipar(*),n
162
DOUBLE PRECISION :: x(HUTI_NDIM),b(HUTI_NDIM),r(HUTI_NDIM),dpar(*),err
163
DOUBLE PRECISION :: d(HUTI_NDIM),res(HUTI_NDIM)
164
165
n = HUTI_NDIM
166
167
IF(ParEnv % PEs>1) THEN
168
CALL SParMatrixVector(x,res,ipar)
169
ELSE
170
CALL CRS_MatrixVectorMultiply(GlobalMatrix,x,res)
171
END IF
172
res = res - b(1:n)
173
174
IF(ParEnv % PEs>1) THEN
175
CALL SParABSMatrixVector(ABS(x),d,ipar)
176
ELSE
177
CALL CRS_ABSMatrixVectorMultiply(GlobalMatrix,ABS(x),d)
178
END IF
179
180
d = d + ABS(b(1:n))
181
182
err = 0.0d0
183
DO i=1,n
184
IF ( ABS(d(i)) < AEPS) THEN
185
IF ( ABS(res(i)) > AEPS ) THEN
186
err = HUGE(err)
187
RETURN
188
ELSE
189
err = MAX(err,0.0d0)
190
END IF
191
ELSE
192
err = MAX(err,ABS(res(i))/d(i))
193
END IF
194
END DO
195
196
err = ParallelReduction(err,2)
197
!------------------------------------------------------------------------------
198
END FUNCTION ComponentwiseBackwardError
199
!------------------------------------------------------------------------------
200
201