1
+ #:include "common.fypp"
2
+ #:set KINDS_TYPES = REAL_KINDS_TYPES + INT_KINDS_TYPES + CMPLX_KINDS_TYPES
1
3
module stdlib_linalg_state
4
+ !! Version: experimental
5
+ !!
6
+ !! Provides a state/error handling derived type for advanced error handling of
7
+ !! BLAS/LAPACK based linear algebra procedures
8
+ !! !! ([Specification](../page/specs/stdlib_linalg.html))
2
9
use stdlib_linalg_constants,only:ilp,lk
3
- use iso_fortran_env,only:real32,real64,real128,int8,int16,int32,int64,stderr => error_unit
10
+ use stdlib_kinds
11
+ use stdlib_io
12
+ use iso_fortran_env,only: stderr => error_unit
4
13
implicit none(type,external)
5
14
private
6
15
@@ -143,7 +152,7 @@ module stdlib_linalg_state
143
152
144
153
end function state_print
145
154
146
- !> Cleanup object
155
+ !> Cleanup the object
147
156
elemental subroutine state_destroy(this)
148
157
class(linalg_state),intent(inout) :: this
149
158
@@ -165,62 +174,84 @@ module stdlib_linalg_state
165
174
state_is_error = this%state /= LINALG_SUCCESS
166
175
end function state_is_error
167
176
168
- !> Compare an error flag with an integer
177
+ !> Compare an error state with an integer flag
169
178
elemental logical(lk) function state_eq_flag(err,flag)
170
179
type(linalg_state),intent(in) :: err
171
180
integer,intent(in) :: flag
172
181
state_eq_flag = err%state == flag
173
182
end function state_eq_flag
183
+
184
+ !> Compare an integer flag with the error state
174
185
elemental logical(lk) function flag_eq_state(flag,err)
175
186
integer,intent(in) :: flag
176
187
type(linalg_state),intent(in) :: err
177
188
flag_eq_state = err%state == flag
178
189
end function flag_eq_state
190
+
191
+ !> Compare the error state with an integer flag
179
192
elemental logical(lk) function state_neq_flag(err,flag)
180
193
type(linalg_state),intent(in) :: err
181
194
integer,intent(in) :: flag
182
195
state_neq_flag = .not. state_eq_flag(err,flag)
183
196
end function state_neq_flag
197
+
198
+ !> Compare an integer flag with the error state
184
199
elemental logical(lk) function flag_neq_state(flag,err)
185
200
integer,intent(in) :: flag
186
201
type(linalg_state),intent(in) :: err
187
202
flag_neq_state = .not. state_eq_flag(err,flag)
188
203
end function flag_neq_state
204
+
205
+ !> Compare the error state with an integer flag
189
206
elemental logical(lk) function state_lt_flag(err,flag)
190
207
type(linalg_state),intent(in) :: err
191
208
integer,intent(in) :: flag
192
209
state_lt_flag = err%state < flag
193
210
end function state_lt_flag
211
+
212
+ !> Compare the error state with an integer flag
194
213
elemental logical(lk) function state_le_flag(err,flag)
195
214
type(linalg_state),intent(in) :: err
196
215
integer,intent(in) :: flag
197
216
state_le_flag = err%state <= flag
198
217
end function state_le_flag
218
+
219
+ !> Compare an integer flag with the error state
199
220
elemental logical(lk) function flag_lt_state(flag,err)
200
221
integer,intent(in) :: flag
201
222
type(linalg_state),intent(in) :: err
202
223
flag_lt_state = err%state < flag
203
224
end function flag_lt_state
225
+
226
+ !> Compare an integer flag with the error state
204
227
elemental logical(lk) function flag_le_state(flag,err)
205
228
integer,intent(in) :: flag
206
229
type(linalg_state),intent(in) :: err
207
230
flag_le_state = err%state <= flag
208
231
end function flag_le_state
232
+
233
+ !> Compare the error state with an integer flag
209
234
elemental logical(lk) function state_gt_flag(err,flag)
210
235
type(linalg_state),intent(in) :: err
211
236
integer,intent(in) :: flag
212
237
state_gt_flag = err%state > flag
213
238
end function state_gt_flag
239
+
240
+ !> Compare the error state with an integer flag
214
241
elemental logical(lk) function state_ge_flag(err,flag)
215
242
type(linalg_state),intent(in) :: err
216
243
integer,intent(in) :: flag
217
244
state_ge_flag = err%state >= flag
218
245
end function state_ge_flag
246
+
247
+ !> Compare an integer flag with the error state
219
248
elemental logical(lk) function flag_gt_state(flag,err)
220
249
integer,intent(in) :: flag
221
250
type(linalg_state),intent(in) :: err
222
251
flag_gt_state = err%state > flag
223
252
end function flag_gt_state
253
+
254
+ !> Compare an integer flag with the error state
224
255
elemental logical(lk) function flag_ge_state(flag,err)
225
256
integer,intent(in) :: flag
226
257
type(linalg_state),intent(in) :: err
@@ -313,65 +344,24 @@ module stdlib_linalg_state
313
344
314
345
select type (aa => a)
315
346
347
+ !> String type
316
348
type is (character(len=*))
317
-
318
349
msg = trim(msg)//sep(:ls)//aa
319
350
320
- type is (integer(int8))
321
-
322
- write (buffer,'(i0)') aa
323
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
324
-
325
- type is (integer(int16))
326
-
327
- write (buffer,'(i0)') aa
328
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
329
-
330
- type is (integer(int32))
331
-
351
+ !> Numeric types
352
+ #:for k1, t1 in KINDS_TYPES
353
+ type is (${t1}$)
354
+ #:if 'real' in t1
355
+ write (buffer,FMT_REAL_${k1}$) aa
356
+ #:elif 'complex' in t1
357
+ write (buffer,FMT_COMPLEX_${k1}$) aa
358
+ #:else
332
359
write (buffer,'(i0)') aa
360
+ #:endif
333
361
msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
334
362
335
- type is (integer(int64))
336
-
337
- write (buffer,'(i0)') aa
338
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
339
-
340
- type is (real(real32))
341
-
342
- write (buffer,'(es15.8e2)') aa
343
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
344
-
345
- type is (real(real64))
346
-
347
- write (buffer,'(es24.16e3)') aa
348
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
349
-
350
- type is (real(real128))
351
-
352
- write (buffer,'(es44.35e4)') aa
353
- msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
354
-
355
- type is (complex(real32))
356
-
357
- write (buffer,'(es15.8e2)') aa%re
358
- write (buffer2,'(es15.8e2)') aa%im
359
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
360
-
361
- type is (complex(real64))
362
-
363
- write (buffer,'(es24.16e3)') aa%re
364
- write (buffer2,'(es24.16e3)') aa%im
365
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
366
-
367
- type is (complex(real128))
368
-
369
- write (buffer,'(es44.35e4)') aa%re
370
- write (buffer2,'(es44.35e4)') aa%im
371
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
372
-
363
+ #:endfor
373
364
class default
374
-
375
365
msg = trim(msg)//' <ERROR: INVALID TYPE>'
376
366
377
367
end select
@@ -384,7 +374,7 @@ module stdlib_linalg_state
384
374
character(len=*),intent(inout) :: msg
385
375
386
376
integer :: j,ls
387
- character(len=MSG_LENGTH) :: buffer,buffer2
377
+ character(len=MSG_LENGTH) :: buffer,buffer2,buffer_format
388
378
character(len=2) :: sep
389
379
390
380
if (.not. present(a)) return
@@ -400,111 +390,33 @@ module stdlib_linalg_state
400
390
! Do not call append(msg(aa(j))), it will crash gfortran
401
391
select type (aa => a)
402
392
393
+ !> Strings (cannot use string_type due to `sequence`)
403
394
type is (character(len=*))
404
-
405
395
msg = trim(msg)//adjustl(aa(1))
406
396
do j = 2,size(a)
407
397
msg = trim(msg)//sep(:ls)//adjustl(aa(j))
408
398
end do
409
399
410
- type is (integer(int8))
411
-
412
- write (buffer,'(i0)') aa(1)
413
- msg = trim(msg)//adjustl(buffer)
414
- do j = 2,size(a)
415
- write (buffer,'(i0)') aa(j)
416
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
417
- end do
418
-
419
- type is (integer(int16))
420
-
421
- write (buffer,'(i0)') aa(1)
422
- msg = trim(msg)//adjustl(buffer)
423
- do j = 2,size(a)
424
- write (buffer,'(i0)') aa(j)
425
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
426
- end do
427
-
428
- type is (integer(int32))
429
-
430
- write (buffer,'(i0)') aa(1)
431
- msg = trim(msg)//adjustl(buffer)
432
- do j = 2,size(a)
433
- write (buffer,'(i0)') aa(j)
434
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
435
- end do
436
-
437
- type is (integer(int64))
438
-
439
- write (buffer,'(i0)') aa(1)
440
- msg = trim(msg)//adjustl(buffer)
441
- do j = 2,size(a)
442
- write (buffer,'(i0)') aa(j)
443
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
444
- end do
445
-
446
- type is (real(real32))
447
-
448
- write (buffer,'(es15.8e2)') aa(1)
400
+ !> Numeric types
401
+ #:for k1, t1 in KINDS_TYPES
402
+ type is (${t1}$)
403
+ #:if 'real' in t1
404
+ buffer_format = FMT_REAL_${k1}$
405
+ #:elif 'complex' in t1
406
+ buffer_format = FMT_COMPLEX_${k1}$
407
+ #:else
408
+ buffer_format = '(i0)'
409
+ #:endif
410
+ write (buffer,buffer_format) aa(1)
449
411
msg = trim(msg)//adjustl(buffer)
450
412
do j = 2,size(a)
451
- write (buffer,'(es15.8e2)' ) aa(j)
413
+ write (buffer,buffer_format ) aa(j)
452
414
msg = trim(msg)//sep(:ls)//adjustl(buffer)
453
415
end do
416
+ msg = trim(msg)//sep(:ls)//trim(adjustl(buffer))
454
417
455
- type is (real(real64))
456
-
457
- write (buffer,'(es24.16e3)') aa(1)
458
- msg = trim(msg)//adjustl(buffer)
459
- do j = 2,size(a)
460
- write (buffer,'(es24.16e3)') aa(j)
461
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
462
- end do
463
-
464
- type is (real(real128))
465
-
466
- write (buffer,'(es44.35e4)') aa(1)
467
- msg = trim(msg)//adjustl(buffer)
468
- do j = 2,size(a)
469
- write (buffer,'(es44.35e4)') aa(j)
470
- msg = trim(msg)//sep(:ls)//adjustl(buffer)
471
- end do
472
-
473
- type is (complex(real32))
474
-
475
- write (buffer,'(es15.8e2)') aa(1)%re
476
- write (buffer2,'(es15.8e2)') aa(1)%im
477
- msg = trim(msg)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
478
- do j = 2,size(a)
479
- write (buffer,'(es15.8e2)') aa(j)%re
480
- write (buffer2,'(es15.8e2)') aa(j)%im
481
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
482
- end do
483
-
484
- type is (complex(real64))
485
-
486
- write (buffer,'(es24.16e3)') aa(1)%re
487
- write (buffer2,'(es24.16e3)') aa(1)%im
488
- msg = trim(msg)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
489
- do j = 2,size(a)
490
- write (buffer,'(es24.16e3)') aa(j)%re
491
- write (buffer2,'(es24.16e3)') aa(j)%im
492
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
493
- end do
494
-
495
- type is (complex(real128))
496
-
497
- write (buffer,'(es44.35e4)') aa(1)%re
498
- write (buffer2,'(es44.35e4)') aa(1)%im
499
- msg = trim(msg)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
500
- do j = 2,size(a)
501
- write (buffer,'(es44.35e4)') aa(j)%re
502
- write (buffer2,'(es44.35e4)') aa(j)%im
503
- msg = trim(msg)//sep(:ls)//'('//trim(adjustl(buffer))//','//trim(adjustl(buffer2))//')'
504
- end do
505
-
418
+ #:endfor
506
419
class default
507
-
508
420
msg = trim(msg)//' <ERROR: INVALID TYPE>'
509
421
510
422
end select
0 commit comments