Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/fhutiter/src/huti_interfaces.F90
3206 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
! *
26
! * Authors: Sami Ilvonen, Mikko Byckling
27
! * Email: [email protected]
28
! * Web: http://www.csc.fi/elmer
29
! * Address: CSC - IT Center for Science Ltd.
30
! * Keilaranta 14
31
! * 02101 Espoo, Finland
32
! *
33
! * Original Date: 26 Feb 2014
34
! *
35
! *****************************************************************************/
36
37
! Module that provides the interfaces for procedure pointers that used in
38
! solvers
39
40
#include "huti_fdefs.h"
41
42
MODULE huti_interfaces
43
IMPLICIT NONE
44
45
ABSTRACT INTERFACE
46
SUBROUTINE mv_iface_s(x, r, ipar)
47
IMPLICIT NONE
48
REAL, DIMENSION(*) :: x, r
49
INTEGER, DIMENSION(*) :: ipar
50
END SUBROUTINE mv_iface_s
51
52
SUBROUTINE pc_iface_s(p, b, ipar)
53
IMPLICIT NONE
54
REAL, DIMENSION(*) :: p, b
55
INTEGER, DIMENSION(*) :: ipar
56
END SUBROUTINE pc_iface_s
57
58
FUNCTION dotp_iface_s(n, x, xinc, y, yinc) RESULT(res)
59
IMPLICIT NONE
60
INTEGER :: n, xinc, yinc
61
REAL, DIMENSION(*) :: x, y
62
REAL :: res
63
END FUNCTION dotp_iface_s
64
65
FUNCTION norm_iface_s(n, b, k) RESULT(res)
66
IMPLICIT NONE
67
INTEGER :: n, k
68
REAL, DIMENSION(*) :: b
69
REAL :: res
70
END FUNCTION norm_iface_s
71
72
FUNCTION stopc_iface_s(x, b, r, ipar, dpar) RESULT(res)
73
IMPLICIT NONE
74
REAL, DIMENSION(*) :: x, b, r
75
INTEGER, DIMENSION(*) :: ipar
76
DOUBLE PRECISION, DIMENSION(*) :: dpar
77
REAL :: res
78
END FUNCTION stopc_iface_s
79
80
SUBROUTINE mv_iface_d(x, r, ipar)
81
IMPLICIT NONE
82
DOUBLE PRECISION, DIMENSION(*) :: x, r
83
INTEGER, DIMENSION(*) :: ipar
84
END SUBROUTINE mv_iface_d
85
86
SUBROUTINE pc_iface_d(p, b, ipar)
87
IMPLICIT NONE
88
DOUBLE PRECISION, DIMENSION(*) :: p, b
89
INTEGER, DIMENSION(*) :: ipar
90
END SUBROUTINE pc_iface_d
91
92
FUNCTION dotp_iface_d(n, x, xinc, y, yinc) RESULT(res)
93
IMPLICIT NONE
94
INTEGER :: n, xinc, yinc
95
DOUBLE PRECISION, DIMENSION(*) :: x, y
96
DOUBLE PRECISION :: res
97
END FUNCTION dotp_iface_d
98
99
FUNCTION norm_iface_d(n, b, k) RESULT(res)
100
IMPLICIT NONE
101
INTEGER :: n, k
102
DOUBLE PRECISION, DIMENSION(*) :: b
103
DOUBLE PRECISION :: res
104
END FUNCTION norm_iface_d
105
106
FUNCTION stopc_iface_d(x, b, r, ipar, dpar) RESULT(res)
107
IMPLICIT NONE
108
DOUBLE PRECISION, DIMENSION(*) :: x, b, r
109
INTEGER, DIMENSION(*) :: ipar
110
DOUBLE PRECISION, DIMENSION(*) :: dpar
111
DOUBLE PRECISION res
112
END FUNCTION stopc_iface_d
113
114
SUBROUTINE mv_iface_c(x, r, ipar)
115
IMPLICIT NONE
116
COMPLEX, DIMENSION(*) :: x, r
117
INTEGER, DIMENSION(*) :: ipar
118
END SUBROUTINE mv_iface_c
119
120
SUBROUTINE pc_iface_c(p, b, ipar)
121
IMPLICIT NONE
122
COMPLEX, DIMENSION(*) :: p, b
123
INTEGER, DIMENSION(*) :: ipar
124
END SUBROUTINE pc_iface_c
125
126
FUNCTION dotp_iface_c(n, x, xinc, y, yinc) RESULT(res)
127
IMPLICIT NONE
128
INTEGER :: n, xinc, yinc
129
COMPLEX, DIMENSION(*) :: x, y
130
COMPLEX :: res
131
END FUNCTION dotp_iface_c
132
133
FUNCTION norm_iface_c(n, b, k) RESULT(res)
134
IMPLICIT NONE
135
INTEGER :: n, k
136
COMPLEX, DIMENSION(*) :: b
137
REAL :: res
138
END FUNCTION norm_iface_c
139
140
FUNCTION stopc_iface_c(x, b, r, ipar, dpar) RESULT(res)
141
IMPLICIT NONE
142
COMPLEX, DIMENSION(*) :: x, b, r
143
INTEGER, DIMENSION(*) :: ipar
144
DOUBLE PRECISION, DIMENSION(*) :: dpar
145
REAL :: res
146
END FUNCTION stopc_iface_c
147
148
SUBROUTINE mv_iface_z(x, r, ipar)
149
IMPLICIT NONE
150
DOUBLE COMPLEX, DIMENSION(*) :: x, r
151
INTEGER, DIMENSION(*) :: ipar
152
END SUBROUTINE mv_iface_z
153
154
SUBROUTINE pc_iface_z(p, b, ipar)
155
IMPLICIT NONE
156
DOUBLE COMPLEX, DIMENSION(*) :: p, b
157
INTEGER, DIMENSION(*) :: ipar
158
END SUBROUTINE pc_iface_z
159
160
FUNCTION dotp_iface_z(n, x, xinc, y, yinc) RESULT(res)
161
IMPLICIT NONE
162
INTEGER :: n, xinc, yinc
163
DOUBLE COMPLEX, DIMENSION(*) :: x, y
164
DOUBLE COMPLEX :: res
165
END FUNCTION dotp_iface_z
166
167
FUNCTION norm_iface_z(n, b, k) RESULT(res)
168
IMPLICIT NONE
169
INTEGER :: n, k
170
DOUBLE COMPLEX, DIMENSION(*) :: b
171
DOUBLE PRECISION :: res
172
END FUNCTION norm_iface_z
173
174
FUNCTION stopc_iface_z(x, b, r, ipar, dpar) RESULT(res)
175
IMPLICIT NONE
176
DOUBLE COMPLEX, DIMENSION(*) :: x, b, r
177
INTEGER, DIMENSION(*) :: ipar
178
DOUBLE PRECISION, DIMENSION(*) :: dpar
179
DOUBLE PRECISION :: res
180
END FUNCTION stopc_iface_z
181
182
END INTERFACE
183
184
! Iterator call, single precision
185
ABSTRACT INTERFACE
186
SUBROUTINE huti_itercall_s(x, b, ipar, dpar, work, &
187
mvfun, pcondfun, pcondrfun, dotfun, normfun, stopcfun )
188
IMPORT :: mv_iface_s, pc_iface_s, dotp_iface_s, norm_iface_s, stopc_iface_s
189
IMPLICIT NONE
190
191
PROCEDURE(mv_iface_s), POINTER :: mvfun
192
PROCEDURE(pc_iface_s), POINTER :: pcondfun, pcondrfun
193
PROCEDURE(dotp_iface_s), POINTER :: dotfun
194
PROCEDURE(norm_iface_s), POINTER :: normfun
195
PROCEDURE(stopc_iface_s), POINTER :: stopcfun
196
197
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
198
REAL, DIMENSION(HUTI_NDIM) :: x, b
199
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
200
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
201
END SUBROUTINE huti_itercall_s
202
203
SUBROUTINE huti_itercall_d(x, b, ipar, dpar, work, &
204
mvfun, pcondfun, pcondrfun, dotfun, normfun, stopcfun )
205
IMPORT :: mv_iface_d, pc_iface_d, dotp_iface_d, norm_iface_d, stopc_iface_d
206
IMPLICIT NONE
207
208
PROCEDURE(mv_iface_d), POINTER :: mvfun
209
PROCEDURE(pc_iface_d), POINTER :: pcondfun, pcondrfun
210
PROCEDURE(dotp_iface_d), POINTER :: dotfun
211
PROCEDURE(norm_iface_d), POINTER :: normfun
212
PROCEDURE(stopc_iface_d), POINTER :: stopcfun
213
214
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
215
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: x, b
216
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
217
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
218
END SUBROUTINE huti_itercall_d
219
220
SUBROUTINE huti_itercall_c(x, b, ipar, dpar, work, &
221
mvfun, pcondfun, pcondrfun, dotfun, normfun, stopcfun )
222
IMPORT :: mv_iface_c, pc_iface_c, dotp_iface_c, norm_iface_c, stopc_iface_c
223
IMPLICIT NONE
224
PROCEDURE(mv_iface_c), POINTER :: mvfun
225
PROCEDURE(pc_iface_c), POINTER :: pcondfun, pcondrfun
226
PROCEDURE(dotp_iface_c), POINTER :: dotfun
227
PROCEDURE(norm_iface_c), POINTER :: normfun
228
PROCEDURE(stopc_iface_c), POINTER :: stopcfun
229
230
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
231
COMPLEX, DIMENSION(HUTI_NDIM) :: x, b
232
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
233
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
234
END SUBROUTINE huti_itercall_c
235
236
SUBROUTINE huti_itercall_z(x, b, ipar, dpar, work, &
237
mvfun, pcondfun, pcondrfun, dotfun, normfun, stopcfun )
238
IMPORT :: mv_iface_z, pc_iface_z, dotp_iface_z, norm_iface_z, stopc_iface_z
239
IMPLICIT NONE
240
PROCEDURE(mv_iface_z), POINTER :: mvfun
241
PROCEDURE(pc_iface_z), POINTER :: pcondfun, pcondrfun
242
PROCEDURE(dotp_iface_z), POINTER :: dotfun
243
PROCEDURE(norm_iface_z), POINTER :: normfun
244
PROCEDURE(stopc_iface_z), POINTER :: stopcfun
245
246
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
247
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: x, b
248
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
249
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
250
END SUBROUTINE huti_itercall_z
251
END INTERFACE
252
END MODULE huti_interfaces
253
254