Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/fhutiter/src/huti_sfe.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
#include "huti_fdefs.h"
26
27
MODULE huti_sfe
28
USE huti_cg
29
USE huti_cgs
30
USE huti_bicgstab
31
USE huti_bicgstab_2
32
USE huti_gmres
33
USE huti_qmr
34
USE huti_tfqmr
35
USE huti_aux
36
USE huti_interfaces
37
IMPLICIT NONE
38
39
INTERFACE
40
41
FUNCTION zdotc(n, x, xinc, y, yinc) RESULT(res)
42
IMPLICIT NONE
43
INTEGER :: n, xinc, yinc
44
DOUBLE COMPLEX :: x(*), y(*)
45
DOUBLE COMPLEX :: res
46
END FUNCTION zdotc
47
48
FUNCTION zdotu(n, x, xinc, y, yinc) RESULT(res)
49
IMPLICIT NONE
50
INTEGER :: n, xinc, yinc
51
DOUBLE COMPLEX :: x(*), y(*)
52
DOUBLE COMPLEX :: res
53
END FUNCTION zdotu
54
55
FUNCTION cdotc(n, x, xinc, y, yinc) RESULT(res)
56
IMPLICIT NONE
57
INTEGER :: n, xinc, yinc
58
COMPLEX :: x(*), y(*)
59
COMPLEX :: res
60
END FUNCTION cdotc
61
62
FUNCTION cdotu(n, x, xinc, y, yinc) RESULT(res)
63
IMPLICIT NONE
64
INTEGER :: n, xinc, yinc
65
COMPLEX :: x(*), y(*)
66
COMPLEX :: res
67
END FUNCTION cdotu
68
69
FUNCTION sdot(n, x, xinc, y, yinc) RESULT(res)
70
IMPLICIT NONE
71
INTEGER :: n, xinc, yinc
72
REAL :: x(*), y(*), res
73
END FUNCTION sdot
74
75
FUNCTION ddot(n, x, xinc, y, yinc) RESULT(res)
76
IMPLICIT NONE
77
INTEGER :: n, xinc, yinc
78
DOUBLE PRECISION :: x(*), y(*), res
79
END FUNCTION ddot
80
81
FUNCTION dnrm2(n, x, xinc) RESULT(res)
82
IMPLICIT NONE
83
INTEGER :: n, xinc
84
DOUBLE PRECISION :: x(*), res
85
END FUNCTION dnrm2
86
87
FUNCTION snrm2(n, x, xinc) RESULT(res)
88
IMPLICIT NONE
89
INTEGER :: n, xinc
90
REAL :: x(*), res
91
END FUNCTION snrm2
92
93
FUNCTION dznrm2(n, x, xinc) RESULT(res)
94
IMPLICIT NONE
95
INTEGER :: n, xinc
96
DOUBLE COMPLEX :: x(*)
97
DOUBLE PRECISION :: res
98
END FUNCTION dznrm2
99
100
FUNCTION scnrm2(n, x, xinc) RESULT(res)
101
IMPLICIT NONE
102
INTEGER :: n, xinc
103
COMPLEX :: x(*)
104
REAL :: res
105
END FUNCTION scnrm2
106
107
END INTERFACE
108
109
CONTAINS
110
111
SUBROUTINE huti_s_cg(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
112
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
113
IMPLICIT NONE
114
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
115
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
116
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
117
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
118
PROCEDURE( norm_iface_s ), POINTER :: normfun
119
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
120
121
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
122
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
123
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
124
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
125
126
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
127
pcondrsubr => huti_sdummy_pcondfun
128
END IF
129
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
130
pcondlsubr => huti_sdummy_pcondfun
131
END IF
132
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
133
dotprodfun => sdot
134
END IF
135
IF(.NOT. ASSOCIATED(normfun) ) THEN
136
normfun => snrm2
137
END IF
138
139
CALL huti_scgsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
140
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
141
& normfun, mstopfun)
142
END SUBROUTINE huti_s_cg
143
144
145
SUBROUTINE huti_s_tfqmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
146
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
147
IMPLICIT NONE
148
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
149
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
150
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
151
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
152
PROCEDURE( norm_iface_s ), POINTER :: normfun
153
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
154
155
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
156
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
157
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
158
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
159
160
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
161
pcondrsubr => huti_sdummy_pcondfun
162
END IF
163
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
164
pcondlsubr => huti_sdummy_pcondfun
165
END IF
166
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
167
dotprodfun => sdot
168
END IF
169
IF(.NOT. ASSOCIATED(normfun) ) THEN
170
normfun => snrm2
171
END IF
172
173
CALL huti_stfqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
174
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
175
& normfun, mstopfun)
176
END SUBROUTINE huti_s_tfqmr
177
178
179
SUBROUTINE huti_s_cgs(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
180
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
181
IMPLICIT NONE
182
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
183
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
184
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
185
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
186
PROCEDURE( norm_iface_s ), POINTER :: normfun
187
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
188
189
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
190
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
191
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
192
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
193
194
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
195
pcondrsubr => huti_sdummy_pcondfun
196
END IF
197
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
198
pcondlsubr => huti_sdummy_pcondfun
199
END IF
200
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
201
dotprodfun => sdot
202
END IF
203
IF(.NOT. ASSOCIATED(normfun) ) THEN
204
normfun => snrm2
205
END IF
206
207
CALL huti_scgssolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
208
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
209
& normfun, mstopfun)
210
END SUBROUTINE huti_s_cgs
211
212
213
SUBROUTINE huti_s_qmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
214
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
215
IMPLICIT NONE
216
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
217
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
218
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
219
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
220
PROCEDURE( norm_iface_s ), POINTER :: normfun
221
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
222
223
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
224
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
225
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
226
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
227
228
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
229
pcondrsubr => huti_sdummy_pcondfun
230
END IF
231
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
232
pcondlsubr => huti_sdummy_pcondfun
233
END IF
234
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
235
dotprodfun => sdot
236
END IF
237
IF(.NOT. ASSOCIATED(normfun) ) THEN
238
normfun => snrm2
239
END IF
240
241
CALL huti_sqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
242
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
243
& normfun, mstopfun)
244
END SUBROUTINE huti_s_qmr
245
246
247
SUBROUTINE huti_s_bicgstab(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
248
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
249
IMPLICIT NONE
250
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
251
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
252
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
253
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
254
PROCEDURE( norm_iface_s ), POINTER :: normfun
255
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
256
257
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
258
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
259
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
260
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
261
262
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
263
pcondrsubr => huti_sdummy_pcondfun
264
END IF
265
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
266
pcondlsubr => huti_sdummy_pcondfun
267
END IF
268
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
269
dotprodfun => sdot
270
END IF
271
IF(.NOT. ASSOCIATED(normfun) ) THEN
272
normfun => snrm2
273
END IF
274
275
CALL huti_sbicgstabsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
276
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
277
& normfun, mstopfun)
278
END SUBROUTINE huti_s_bicgstab
279
280
281
SUBROUTINE huti_s_gmres(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
282
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
283
IMPLICIT NONE
284
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
285
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
286
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
287
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
288
PROCEDURE( norm_iface_s ), POINTER :: normfun
289
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
290
291
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
292
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
293
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
294
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
295
296
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
297
pcondrsubr => huti_sdummy_pcondfun
298
END IF
299
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
300
pcondlsubr => huti_sdummy_pcondfun
301
END IF
302
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
303
dotprodfun => sdot
304
END IF
305
IF(.NOT. ASSOCIATED(normfun) ) THEN
306
normfun => snrm2
307
END IF
308
309
CALL huti_sgmressolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
310
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
311
& normfun, mstopfun)
312
END SUBROUTINE huti_s_gmres
313
314
315
SUBROUTINE huti_s_bicgstab_2(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
316
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
317
IMPLICIT NONE
318
PROCEDURE( mv_iface_s ), POINTER :: matvecsubr
319
PROCEDURE( pc_iface_s ), POINTER :: pcondlsubr
320
PROCEDURE( pc_iface_s ), POINTER :: pcondrsubr
321
PROCEDURE( dotp_iface_s ), POINTER :: dotprodfun
322
PROCEDURE( norm_iface_s ), POINTER :: normfun
323
PROCEDURE( stopc_iface_s ), POINTER :: mstopfun
324
325
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
326
REAL, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
327
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
328
REAL, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
329
330
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
331
pcondrsubr => huti_sdummy_pcondfun
332
END IF
333
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
334
pcondlsubr => huti_sdummy_pcondfun
335
END IF
336
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
337
dotprodfun => sdot
338
END IF
339
IF(.NOT. ASSOCIATED(normfun) ) THEN
340
normfun => snrm2
341
END IF
342
343
CALL huti_sbicgstab_2solv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, &
344
&dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
345
& normfun, mstopfun)
346
END SUBROUTINE huti_s_bicgstab_2
347
348
349
SUBROUTINE huti_d_cg(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
350
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
351
IMPLICIT NONE
352
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
353
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
354
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
355
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
356
PROCEDURE( norm_iface_d ), POINTER :: normfun
357
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
358
359
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
360
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
361
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
362
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
363
364
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
365
pcondrsubr => huti_ddummy_pcondfun
366
END IF
367
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
368
pcondlsubr => huti_ddummy_pcondfun
369
END IF
370
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
371
dotprodfun => ddot
372
END IF
373
IF(.NOT. ASSOCIATED(normfun) ) THEN
374
normfun => dnrm2
375
END IF
376
377
CALL huti_dcgsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
378
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
379
& normfun, mstopfun)
380
END SUBROUTINE huti_d_cg
381
382
383
SUBROUTINE huti_d_cgs(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
384
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
385
IMPLICIT NONE
386
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
387
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
388
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
389
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
390
PROCEDURE( norm_iface_d ), POINTER :: normfun
391
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
392
393
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
394
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
395
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
396
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
397
398
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
399
pcondrsubr => huti_ddummy_pcondfun
400
END IF
401
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
402
pcondlsubr => huti_ddummy_pcondfun
403
END IF
404
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
405
dotprodfun => ddot
406
END IF
407
IF(.NOT. ASSOCIATED(normfun) ) THEN
408
normfun => dnrm2
409
END IF
410
411
CALL huti_dcgssolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
412
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
413
& normfun, mstopfun)
414
END SUBROUTINE huti_d_cgs
415
416
417
SUBROUTINE huti_d_bicgstab(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
418
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
419
IMPLICIT NONE
420
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
421
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
422
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
423
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
424
PROCEDURE( norm_iface_d ), POINTER :: normfun
425
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
426
427
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
428
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
429
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
430
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
431
432
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
433
pcondrsubr => huti_ddummy_pcondfun
434
END IF
435
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
436
pcondlsubr => huti_ddummy_pcondfun
437
END IF
438
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
439
dotprodfun => ddot
440
END IF
441
IF(.NOT. ASSOCIATED(normfun) ) THEN
442
normfun => dnrm2
443
END IF
444
445
CALL huti_dbicgstabsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
446
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
447
& normfun, mstopfun)
448
END SUBROUTINE huti_d_bicgstab
449
450
451
SUBROUTINE huti_d_tfqmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
452
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
453
IMPLICIT NONE
454
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
455
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
456
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
457
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
458
PROCEDURE( norm_iface_d ), POINTER :: normfun
459
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
460
461
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
462
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
463
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
464
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
465
466
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
467
pcondrsubr => huti_ddummy_pcondfun
468
END IF
469
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
470
pcondlsubr => huti_ddummy_pcondfun
471
END IF
472
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
473
dotprodfun => ddot
474
END IF
475
IF(.NOT. ASSOCIATED(normfun) ) THEN
476
normfun => dnrm2
477
END IF
478
479
CALL huti_dtfqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
480
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
481
& normfun, mstopfun)
482
END SUBROUTINE huti_d_tfqmr
483
484
485
SUBROUTINE huti_d_qmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
486
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
487
IMPLICIT NONE
488
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
489
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
490
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
491
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
492
PROCEDURE( norm_iface_d ), POINTER :: normfun
493
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
494
495
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
496
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
497
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
498
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
499
500
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
501
pcondrsubr => huti_ddummy_pcondfun
502
END IF
503
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
504
pcondlsubr => huti_ddummy_pcondfun
505
END IF
506
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
507
dotprodfun => ddot
508
END IF
509
IF(.NOT. ASSOCIATED(normfun) ) THEN
510
normfun => dnrm2
511
END IF
512
513
CALL huti_dqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
514
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
515
& normfun, mstopfun)
516
END SUBROUTINE huti_d_qmr
517
518
519
SUBROUTINE huti_d_gmres(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
520
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
521
IMPLICIT NONE
522
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
523
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
524
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
525
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
526
PROCEDURE( norm_iface_d ), POINTER :: normfun
527
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
528
529
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
530
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
531
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
532
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
533
534
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
535
pcondrsubr => huti_ddummy_pcondfun
536
END IF
537
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
538
pcondlsubr => huti_ddummy_pcondfun
539
END IF
540
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
541
dotprodfun => ddot
542
END IF
543
IF(.NOT. ASSOCIATED(normfun) ) THEN
544
normfun => dnrm2
545
END IF
546
547
CALL huti_dgmressolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
548
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
549
& normfun, mstopfun)
550
END SUBROUTINE huti_d_gmres
551
552
553
SUBROUTINE huti_d_bicgstab_2(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
554
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
555
IMPLICIT NONE
556
PROCEDURE( mv_iface_d ), POINTER :: matvecsubr
557
PROCEDURE( pc_iface_d ), POINTER :: pcondlsubr
558
PROCEDURE( pc_iface_d ), POINTER :: pcondrsubr
559
PROCEDURE( dotp_iface_d ), POINTER :: dotprodfun
560
PROCEDURE( norm_iface_d ), POINTER :: normfun
561
PROCEDURE( stopc_iface_d ), POINTER :: mstopfun
562
563
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
564
DOUBLE PRECISION, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
565
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
566
DOUBLE PRECISION, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
567
568
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
569
pcondrsubr => huti_ddummy_pcondfun
570
END IF
571
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
572
pcondlsubr => huti_ddummy_pcondfun
573
END IF
574
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
575
dotprodfun => ddot
576
END IF
577
IF(.NOT. ASSOCIATED(normfun) ) THEN
578
normfun => dnrm2
579
END IF
580
581
CALL huti_dbicgstab_2solv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, &
582
& dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
583
& normfun, mstopfun)
584
END SUBROUTINE huti_d_bicgstab_2
585
586
587
SUBROUTINE huti_c_cg(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
588
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
589
IMPLICIT NONE
590
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
591
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
592
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
593
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
594
PROCEDURE( norm_iface_c ), POINTER :: normfun
595
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
596
597
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
598
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
599
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
600
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
601
602
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
603
pcondrsubr => huti_cdummy_pcondfun
604
END IF
605
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
606
pcondlsubr => huti_cdummy_pcondfun
607
END IF
608
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
609
dotprodfun => cdotc
610
END IF
611
IF(.NOT. ASSOCIATED(normfun) ) THEN
612
normfun => scnrm2
613
END IF
614
615
CALL huti_ccgsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
616
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
617
& normfun, mstopfun)
618
END SUBROUTINE huti_c_cg
619
620
621
SUBROUTINE huti_c_cgs(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
622
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
623
IMPLICIT NONE
624
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
625
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
626
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
627
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
628
PROCEDURE( norm_iface_c ), POINTER :: normfun
629
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
630
631
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
632
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
633
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
634
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
635
636
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
637
pcondrsubr => huti_cdummy_pcondfun
638
END IF
639
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
640
pcondlsubr => huti_cdummy_pcondfun
641
END IF
642
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
643
dotprodfun => cdotc
644
END IF
645
IF(.NOT. ASSOCIATED(normfun) ) THEN
646
normfun => scnrm2
647
END IF
648
649
CALL huti_ccgsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
650
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
651
& normfun, mstopfun)
652
END SUBROUTINE huti_c_cgs
653
654
655
SUBROUTINE huti_c_bicgstab(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
656
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
657
IMPLICIT NONE
658
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
659
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
660
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
661
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
662
PROCEDURE( norm_iface_c ), POINTER :: normfun
663
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
664
665
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
666
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
667
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
668
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
669
670
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
671
pcondrsubr => huti_cdummy_pcondfun
672
END IF
673
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
674
pcondlsubr => huti_cdummy_pcondfun
675
END IF
676
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
677
dotprodfun => cdotc
678
END IF
679
IF(.NOT. ASSOCIATED(normfun) ) THEN
680
normfun => scnrm2
681
END IF
682
683
CALL huti_cbicgstabsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
684
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
685
& normfun, mstopfun)
686
END SUBROUTINE huti_c_bicgstab
687
688
689
SUBROUTINE huti_c_qmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
690
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
691
IMPLICIT NONE
692
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
693
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
694
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
695
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
696
PROCEDURE( norm_iface_c ), POINTER :: normfun
697
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
698
699
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
700
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
701
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
702
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
703
704
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
705
pcondrsubr => huti_cdummy_pcondfun
706
END IF
707
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
708
pcondlsubr => huti_cdummy_pcondfun
709
END IF
710
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
711
dotprodfun => cdotc
712
END IF
713
IF(.NOT. ASSOCIATED(normfun) ) THEN
714
normfun => scnrm2
715
END IF
716
717
CALL huti_cqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
718
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
719
& normfun, mstopfun)
720
END SUBROUTINE huti_c_qmr
721
722
723
SUBROUTINE huti_c_tfqmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
724
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
725
IMPLICIT NONE
726
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
727
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
728
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
729
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
730
PROCEDURE( norm_iface_c ), POINTER :: normfun
731
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
732
733
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
734
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
735
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
736
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
737
738
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
739
pcondrsubr => huti_cdummy_pcondfun
740
END IF
741
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
742
pcondlsubr => huti_cdummy_pcondfun
743
END IF
744
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
745
dotprodfun => cdotc
746
END IF
747
IF(.NOT. ASSOCIATED(normfun) ) THEN
748
normfun => scnrm2
749
END IF
750
751
CALL huti_ctfqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
752
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
753
& normfun, mstopfun)
754
END SUBROUTINE huti_c_tfqmr
755
756
757
SUBROUTINE huti_c_gmres(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
758
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
759
IMPLICIT NONE
760
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
761
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
762
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
763
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
764
PROCEDURE( norm_iface_c ), POINTER :: normfun
765
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
766
767
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
768
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
769
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
770
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
771
772
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
773
pcondrsubr => huti_cdummy_pcondfun
774
END IF
775
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
776
pcondlsubr => huti_cdummy_pcondfun
777
END IF
778
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
779
dotprodfun => cdotc
780
END IF
781
IF(.NOT. ASSOCIATED(normfun) ) THEN
782
normfun => scnrm2
783
END IF
784
785
CALL huti_cgmressolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
786
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
787
& normfun, mstopfun)
788
END SUBROUTINE huti_c_gmres
789
790
791
SUBROUTINE huti_c_bicgstab_2(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
792
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
793
IMPLICIT NONE
794
PROCEDURE( mv_iface_c ), POINTER :: matvecsubr
795
PROCEDURE( pc_iface_c ), POINTER :: pcondlsubr
796
PROCEDURE( pc_iface_c ), POINTER :: pcondrsubr
797
PROCEDURE( dotp_iface_c ), POINTER :: dotprodfun
798
PROCEDURE( norm_iface_c ), POINTER :: normfun
799
PROCEDURE( stopc_iface_c ), POINTER :: mstopfun
800
801
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
802
COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
803
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
804
COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
805
806
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
807
pcondrsubr => huti_cdummy_pcondfun
808
END IF
809
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
810
pcondlsubr => huti_cdummy_pcondfun
811
END IF
812
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
813
dotprodfun => cdotc
814
END IF
815
IF(.NOT. ASSOCIATED(normfun) ) THEN
816
normfun => scnrm2
817
END IF
818
819
CALL huti_cbicgstab_2solv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, &
820
& dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
821
& normfun, mstopfun)
822
END SUBROUTINE huti_c_bicgstab_2
823
824
825
SUBROUTINE huti_z_cg(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
826
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
827
IMPLICIT NONE
828
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
829
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
830
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
831
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
832
PROCEDURE( norm_iface_z ), POINTER :: normfun
833
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
834
835
INTEGER :: ndim, wrkdim
836
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
837
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
838
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
839
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
840
841
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
842
pcondrsubr => huti_zdummy_pcondfun
843
END IF
844
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
845
pcondlsubr => huti_zdummy_pcondfun
846
END IF
847
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
848
dotprodfun => zdotc
849
END IF
850
IF(.NOT. ASSOCIATED(normfun) ) THEN
851
normfun => dznrm2
852
END IF
853
854
CALL huti_zcgsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
855
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
856
& normfun, mstopfun)
857
END SUBROUTINE huti_z_cg
858
859
860
SUBROUTINE huti_z_cgs(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
861
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
862
863
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
864
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
865
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
866
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
867
PROCEDURE( norm_iface_z ), POINTER :: normfun
868
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
869
870
INTEGER :: ndim, wrkdim
871
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
872
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
873
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
874
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
875
876
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
877
pcondrsubr => huti_zdummy_pcondfun
878
END IF
879
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
880
pcondlsubr => huti_zdummy_pcondfun
881
END IF
882
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
883
dotprodfun => zdotc
884
END IF
885
IF(.NOT. ASSOCIATED(normfun) ) THEN
886
normfun => dznrm2
887
END IF
888
889
CALL huti_zcgssolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
890
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
891
& normfun, mstopfun)
892
END SUBROUTINE huti_z_cgs
893
894
895
SUBROUTINE huti_z_bicgstab(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
896
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
897
898
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
899
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
900
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
901
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
902
PROCEDURE( norm_iface_z ), POINTER :: normfun
903
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
904
905
INTEGER :: ndim, wrkdim
906
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
907
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
908
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
909
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
910
911
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
912
pcondrsubr => huti_zdummy_pcondfun
913
END IF
914
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
915
pcondlsubr => huti_zdummy_pcondfun
916
END IF
917
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
918
dotprodfun => zdotc
919
END IF
920
IF(.NOT. ASSOCIATED(normfun) ) THEN
921
normfun => dznrm2
922
END IF
923
924
CALL huti_zbicgstabsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
925
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
926
& normfun, mstopfun)
927
END SUBROUTINE huti_z_bicgstab
928
929
930
SUBROUTINE huti_z_qmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
931
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
932
933
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
934
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
935
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
936
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
937
PROCEDURE( norm_iface_z ), POINTER :: normfun
938
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
939
940
INTEGER :: ndim, wrkdim
941
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
942
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
943
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
944
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
945
946
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
947
pcondrsubr => huti_zdummy_pcondfun
948
END IF
949
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
950
pcondlsubr => huti_zdummy_pcondfun
951
END IF
952
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
953
dotprodfun => zdotc
954
END IF
955
IF(.NOT. ASSOCIATED(normfun) ) THEN
956
normfun => dznrm2
957
END IF
958
959
CALL huti_zqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
960
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
961
& normfun, mstopfun)
962
END SUBROUTINE huti_z_qmr
963
964
965
SUBROUTINE huti_z_tfqmr(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
966
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
967
968
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
969
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
970
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
971
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
972
PROCEDURE( norm_iface_z ), POINTER :: normfun
973
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
974
975
INTEGER :: ndim, wrkdim
976
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
977
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
978
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
979
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
980
981
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
982
pcondrsubr => huti_zdummy_pcondfun
983
END IF
984
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
985
pcondlsubr => huti_zdummy_pcondfun
986
END IF
987
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
988
dotprodfun => zdotc
989
END IF
990
IF(.NOT. ASSOCIATED(normfun) ) THEN
991
normfun => dznrm2
992
END IF
993
994
CALL huti_ztfqmrsolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
995
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
996
& normfun, mstopfun)
997
END SUBROUTINE huti_z_tfqmr
998
999
1000
SUBROUTINE huti_z_gmres(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
1001
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
1002
1003
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
1004
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
1005
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
1006
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
1007
PROCEDURE( norm_iface_z ), POINTER :: normfun
1008
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
1009
1010
INTEGER :: ndim, wrkdim
1011
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
1012
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
1013
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
1014
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
1015
1016
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
1017
pcondrsubr => huti_zdummy_pcondfun
1018
END IF
1019
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
1020
pcondlsubr => huti_zdummy_pcondfun
1021
END IF
1022
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
1023
dotprodfun => zdotc
1024
END IF
1025
IF(.NOT. ASSOCIATED(normfun) ) THEN
1026
normfun => dznrm2
1027
END IF
1028
1029
CALL huti_zgmressolv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, dpar, &
1030
& work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
1031
& normfun, mstopfun)
1032
END SUBROUTINE huti_z_gmres
1033
1034
1035
SUBROUTINE huti_z_bicgstab_2(xvec, rhsvec, ipar, dpar, work, matvecsubr, &
1036
& pcondlsubr, pcondrsubr, dotprodfun, normfun, mstopfun)
1037
1038
PROCEDURE( mv_iface_z ), POINTER :: matvecsubr
1039
PROCEDURE( pc_iface_z ), POINTER :: pcondlsubr
1040
PROCEDURE( pc_iface_z ), POINTER :: pcondrsubr
1041
PROCEDURE( dotp_iface_z ), POINTER :: dotprodfun
1042
PROCEDURE( norm_iface_z ), POINTER :: normfun
1043
PROCEDURE( stopc_iface_z ), POINTER :: mstopfun
1044
1045
INTEGER :: ndim, wrkdim
1046
INTEGER, DIMENSION(HUTI_IPAR_DFLTSIZE) :: ipar
1047
DOUBLE COMPLEX, DIMENSION(HUTI_NDIM) :: xvec, rhsvec
1048
DOUBLE PRECISION, DIMENSION(HUTI_DPAR_DFLTSIZE) :: dpar
1049
DOUBLE COMPLEX, DIMENSION(HUTI_WRKDIM,HUTI_NDIM) :: work
1050
1051
IF(.NOT. ASSOCIATED(pcondrsubr) ) THEN
1052
pcondrsubr => huti_zdummy_pcondfun
1053
END IF
1054
IF(.NOT. ASSOCIATED(pcondlsubr) ) THEN
1055
pcondlsubr => huti_zdummy_pcondfun
1056
END IF
1057
IF(.NOT. ASSOCIATED(dotprodfun) ) THEN
1058
dotprodfun => zdotc
1059
END IF
1060
IF(.NOT. ASSOCIATED(normfun) ) THEN
1061
normfun => dznrm2
1062
END IF
1063
1064
CALL huti_zbicgstab_2solv(HUTI_NDIM, HUTI_WRKDIM, xvec, rhsvec, ipar, &
1065
& dpar, work, matvecsubr, pcondlsubr, pcondrsubr, dotprodfun, &
1066
& normfun, mstopfun)
1067
END SUBROUTINE huti_z_bicgstab_2
1068
1069
1070
END MODULE huti_sfe
1071
1072