From 2c26ccfd3211bd1f89c326cfbefef3592cc8769c Mon Sep 17 00:00:00 2001
From: Alycia Lisito <alycia.lisito@inria.fr>
Date: Mon, 10 Oct 2022 15:30:26 +0200
Subject: [PATCH 1/2] genRHS: Adds the type of the vectors b and x if
 spm->flttype == SpmPattern.

---
 include/spm.h                 |  1 +
 src/spm_rhs.c                 | 15 +++++++++++++--
 src/z_spm_genrhs.c            | 12 +++++++++---
 tests/spm_dist_genrhs_tests.c |  4 ++--
 4 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/include/spm.h b/include/spm.h
index ba5e97cf..ab4406ff 100644
--- a/include/spm.h
+++ b/include/spm.h
@@ -187,6 +187,7 @@ int spmGenVec( spm_rhstype_t          type,
                void                  *x,
                spm_int_t              incx );
 int spmGenRHS( spm_rhstype_t     type,
+               spm_coeftype_t    flttype,
                spm_int_t         nrhs,
                const spmatrix_t *spm,
                void *            opt_X,
diff --git a/src/spm_rhs.c b/src/spm_rhs.c
index 4b299359..5715508e 100644
--- a/src/spm_rhs.c
+++ b/src/spm_rhs.c
@@ -91,6 +91,11 @@ spmPrintRHS( const spmatrix_t *spm,
  *            x is a random vector in the range [-0.5, 0.5]
  *          - SpmRhsRndB: b is computed randomly and x is not computed.
  *
+ * @param[in] flttype
+ *          If spm->flttype == SpmPatern and flttype != SpmPatern then flttype
+ *          is the type of b and x.
+ *          If spm->flttype != SpmPatern then b and x are spm->flttype.
+ *
  * @param[in] nrhs
  *          Defines the number of right hand side that must be generated.
  *
@@ -122,6 +127,7 @@ spmPrintRHS( const spmatrix_t *spm,
  *******************************************************************************/
 int
 spmGenRHS( spm_rhstype_t     type,
+           spm_coeftype_t    flttype,
            spm_int_t         nrhs,
            const spmatrix_t *spm,
            void             *x,
@@ -129,14 +135,19 @@ spmGenRHS( spm_rhstype_t     type,
            void             *b,
            spm_int_t         ldb )
 {
+    int id;
     static int (*ptrfunc[4])( spm_rhstype_t, int,
                               const spmatrix_t *,
                               void *, int, void *, int ) =
         {
             s_spmGenRHS, d_spmGenRHS, c_spmGenRHS, z_spmGenRHS
         };
-
-    int id = spm->flttype - SpmFloat;
+    if ( spm->flttype == SpmPattern ) {
+        id = flttype - SpmFloat;
+    }
+    else {
+        id = spm->flttype - SpmFloat;
+    }
 
     if ( (x != NULL) && (ldx < spm_imax( 1, spm->nexp )) ) {
         fprintf( stderr, "spmGenRHS: ldx must be >= max( 1, spm->nexp )\n" );
diff --git a/src/z_spm_genrhs.c b/src/z_spm_genrhs.c
index 293a9f05..f51e2dc7 100644
--- a/src/z_spm_genrhs.c
+++ b/src/z_spm_genrhs.c
@@ -111,11 +111,17 @@ z_spmGenRHS( spm_rhstype_t     type,
 
     /* If random b, we do it and exit */
     if ( type == SpmRhsRndB ) {
-        /* Compute the spm norm to scale the b vector */
-        spm_complex64_t norm = z_spmNorm( SpmFrobeniusNorm, spm );
-        if ( norm == 0. ) {
+        spm_complex64_t norm;
+        if ( spm->flttype == SpmPattern ) {
             norm = 1.;
         }
+        else {
+            /* Compute the spm norm to scale the b vector */
+            norm = z_spmNorm( SpmFrobeniusNorm, spm );
+            if ( norm == 0. ) {
+                norm = 1.;
+            }
+        }
         z_spmGenMat( type, nrhs, spm, &norm, 24356, bptr, ldb );
 
         return SPM_SUCCESS;
diff --git a/tests/spm_dist_genrhs_tests.c b/tests/spm_dist_genrhs_tests.c
index cf343bfc..60299452 100644
--- a/tests/spm_dist_genrhs_tests.c
+++ b/tests/spm_dist_genrhs_tests.c
@@ -76,7 +76,7 @@ int main (int argc, char **argv)
         memset( bloc, 0xab, sizeloc );
         ldx = spm_imax( 1, original.nexp );
 
-        if ( spmGenRHS( type, nrhs, &original,
+        if ( spmGenRHS( type, spmd.flttype, nrhs, &original,
                         NULL, ldx, bloc, ldx ) != SPM_SUCCESS ) {
             fprintf( stderr, "Issue to generate the local rhs\n" );
             continue;
@@ -104,7 +104,7 @@ int main (int argc, char **argv)
 
             memset( bdst, 0xab, sizedst );
             ldx = spm_imax( 1, spmd.nexp );
-            if ( spmGenRHS( type, nrhs, &spmd,
+            if ( spmGenRHS( type, spmd.flttype, nrhs, &spmd,
                             NULL, ldx, bdst, ldx ) != SPM_SUCCESS ) {
                 err++;
                 continue;
-- 
GitLab


From 77c7b325280cdfaaebe762134525b6a8603df592 Mon Sep 17 00:00:00 2001
From: Alycia Lisito <alycia.lisito@inria.fr>
Date: Mon, 10 Oct 2022 15:31:17 +0200
Subject: [PATCH 2/2] wrappers: Updates the wrappers.

---
 wrappers/fortran90/examples/spmf_driver.F90 |  2 +-
 wrappers/fortran90/examples/spmf_user.F90   |  2 +-
 wrappers/fortran90/src/spm_f2c.c            |  5 +++--
 wrappers/fortran90/src/spmf_bindings.f90    |  5 +++--
 wrappers/fortran90/src/spmf_enums.F90       |  2 +-
 wrappers/fortran90/src/spmf_functions.f90   |  9 ++++++---
 wrappers/fortran90/src/spmf_interfaces.f90  |  6 ++++--
 wrappers/julia/spm/src/spm.jl               |  4 ++--
 wrappers/julia/spm/src/spm_enums.jl.in      |  2 +-
 wrappers/julia/spm_driver.jl                |  2 +-
 wrappers/julia/spm_user.jl                  |  2 +-
 wrappers/python/spm/__spm__.py              | 11 ++++++-----
 wrappers/python/spm/enum.py.in              |  2 +-
 wrappers/python/spm/spm.py                  |  2 +-
 14 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/wrappers/fortran90/examples/spmf_driver.F90 b/wrappers/fortran90/examples/spmf_driver.F90
index dcd1bdd7..1509ac3f 100644
--- a/wrappers/fortran90/examples/spmf_driver.F90
+++ b/wrappers/fortran90/examples/spmf_driver.F90
@@ -50,7 +50,7 @@ program spmf_driver
   allocate(b( spm%nexp, nrhs))
 
   ! Compute b = A * x, with x random
-  call spmGenRHS( SpmRhsRndX, nrhs, spm, x0, spm%nexp, b, spm%nexp, info )
+  call spmGenRHS( SpmRhsRndX, spm%flttype, nrhs, spm, x0, spm%nexp, b, spm%nexp, info )
 
   ! Copy x0 into x
   x = x0
diff --git a/wrappers/fortran90/examples/spmf_user.F90 b/wrappers/fortran90/examples/spmf_user.F90
index a3a58bc0..42e7687e 100644
--- a/wrappers/fortran90/examples/spmf_user.F90
+++ b/wrappers/fortran90/examples/spmf_user.F90
@@ -129,7 +129,7 @@ program spmf_user
   allocate(b( spm%nexp, nrhs))
 
   ! Compute b = A * x, with x random
-  call spmGenRHS( SpmRhsRndX, nrhs, spm, x0, spm%nexp, b, spm%nexp, info )
+  call spmGenRHS( SpmRhsRndX, spm%flttype, nrhs, spm, x0, spm%nexp, b, spm%nexp, info )
 
   ! Copy x0 into x
   x = x0
diff --git a/wrappers/fortran90/src/spm_f2c.c b/wrappers/fortran90/src/spm_f2c.c
index 573e4d33..eef3479b 100644
--- a/wrappers/fortran90/src/spm_f2c.c
+++ b/wrappers/fortran90/src/spm_f2c.c
@@ -9,7 +9,7 @@
  * @version 1.2.0
  * @author Mathieu Faverge
  * @author Tony Delarue
- * @date 2022-02-22
+ * @date 2022-10-10
  *
  * This file has been automatically generated with gen_wrappers.py
  *
@@ -255,6 +255,7 @@ spmGenVec_f2c( spm_rhstype_t          type,
 
 int
 spmGenRHS_f2c( spm_rhstype_t     type,
+               spm_coeftype_t    flttype,
                spm_int_t         nrhs,
                const spmatrix_t *spm,
                void             *opt_X,
@@ -262,7 +263,7 @@ spmGenRHS_f2c( spm_rhstype_t     type,
                void             *B,
                spm_int_t         ldb )
 {
-    return spmGenRHS( type, nrhs, spm, opt_X, opt_ldx, B, ldb );
+    return spmGenRHS( type, flttype, nrhs, spm, opt_X, opt_ldx, B, ldb );
 }
 
 int
diff --git a/wrappers/fortran90/src/spmf_bindings.f90 b/wrappers/fortran90/src/spmf_bindings.f90
index e146ab3d..afe4c189 100644
--- a/wrappers/fortran90/src/spmf_bindings.f90
+++ b/wrappers/fortran90/src/spmf_bindings.f90
@@ -9,7 +9,7 @@
 !> @version 1.2.0
 !> @author Mathieu Faverge
 !> @author Tony Delarue
-!> @date 2022-02-22
+!> @date 2022-10-10
 !>
 !> This file has been automatically generated with gen_wrappers.py
 !>
@@ -312,13 +312,14 @@ module spmf_bindings
        integer(kind=spm_int_t),   value :: incx
      end function spmGenVec_f2c
 
-     function spmGenRHS_f2c(type, nrhs, spm, opt_X, opt_ldx, B, ldb) &
+     function spmGenRHS_f2c(type, flttype, nrhs, spm, opt_X, opt_ldx, B, ldb) &
           bind(c, name='spmGenRHS_f2c')
        use :: iso_c_binding, only : c_int, c_ptr
        use :: spmf_enums,    only : spm_int_t
        implicit none
        integer(kind=c_int)            :: spmGenRHS_f2c
        integer(c_int),          value :: type
+       integer(c_int),          value :: flttype
        integer(kind=spm_int_t), value :: nrhs
        type(c_ptr),             value :: spm
        type(c_ptr),             value :: opt_X
diff --git a/wrappers/fortran90/src/spmf_enums.F90 b/wrappers/fortran90/src/spmf_enums.F90
index 4485329d..406187c4 100644
--- a/wrappers/fortran90/src/spmf_enums.F90
+++ b/wrappers/fortran90/src/spmf_enums.F90
@@ -9,7 +9,7 @@
 !> @version 1.2.0
 !> @author Mathieu Faverge
 !> @author Tony Delarue
-!> @date 2022-02-22
+!> @date 2022-10-10
 !>
 !> This file has been automatically generated with gen_wrappers.py
 !>
diff --git a/wrappers/fortran90/src/spmf_functions.f90 b/wrappers/fortran90/src/spmf_functions.f90
index d6fa2f99..210d003e 100644
--- a/wrappers/fortran90/src/spmf_functions.f90
+++ b/wrappers/fortran90/src/spmf_functions.f90
@@ -9,7 +9,7 @@
 !> @version 1.2.0
 !> @author Mathieu Faverge
 !> @author Tony Delarue
-!> @date 2022-02-22
+!> @date 2022-10-10
 !>
 !> This file has been automatically generated with gen_wrappers.py
 !>
@@ -545,7 +545,8 @@ subroutine spmGenVec_f08(type, spm, alpha, seed, x, incx, info)
 
 end subroutine spmGenVec_f08
 
-subroutine spmGenRHS_f08(type, nrhs, spm, opt_X, opt_ldx, B, ldb, info)
+subroutine spmGenRHS_f08(type, flttype, nrhs, spm, opt_X, opt_ldx, B, ldb, &
+     info)
   use :: spmf_interfaces, only : spmGenRHS
   use :: spmf_bindings,   only : spmGenRHS_f2c
   use :: iso_c_binding,   only : c_int, c_loc, c_null_ptr, c_ptr
@@ -553,6 +554,7 @@ subroutine spmGenRHS_f08(type, nrhs, spm, opt_X, opt_ldx, B, ldb, info)
   use :: spmf_enums,      only : spm_int_t, spmatrix_t
   implicit none
   integer(c_int),          intent(in)                      :: type
+  integer(c_int),          intent(in)                      :: flttype
   integer(kind=spm_int_t), intent(in)                      :: nrhs
   type(spmatrix_t),        intent(in),    target           :: spm
   class(*),                intent(inout), target, optional :: opt_X(:,:)
@@ -570,7 +572,8 @@ subroutine spmGenRHS_f08(type, nrhs, spm, opt_X, opt_ldx, B, ldb, info)
   if ( present(opt_ldx) ) x_opt_ldx = opt_ldx
   x_B       = spmGetCptrFrom2dArray(B)
 
-  x_info = spmGenRHS_f2c(type, nrhs, c_loc(spm), x_opt_X, x_opt_ldx, x_B, ldb)
+  x_info = spmGenRHS_f2c(type, flttype, nrhs, c_loc(spm), x_opt_X, x_opt_ldx, &
+       x_B, ldb)
   if ( present(info) ) info = x_info
 
 end subroutine spmGenRHS_f08
diff --git a/wrappers/fortran90/src/spmf_interfaces.f90 b/wrappers/fortran90/src/spmf_interfaces.f90
index 96261de4..6cfa4b4e 100644
--- a/wrappers/fortran90/src/spmf_interfaces.f90
+++ b/wrappers/fortran90/src/spmf_interfaces.f90
@@ -9,7 +9,7 @@
 !> @version 1.2.0
 !> @author Mathieu Faverge
 !> @author Tony Delarue
-!> @date 2022-02-22
+!> @date 2022-10-10
 !>
 !> This file has been automatically generated with gen_wrappers.py
 !>
@@ -331,12 +331,14 @@ module spmf_interfaces
   end interface spmGenVec
 
   interface spmGenRHS
-     subroutine spmGenRHS_f08(type, nrhs, spm, opt_X, opt_ldx, B, ldb, info)
+     subroutine spmGenRHS_f08(type, flttype, nrhs, spm, opt_X, opt_ldx, B, &
+          ldb, info)
        use :: iso_c_binding, only : c_int, c_ptr
        use :: spmf_bindings, only : spmGetCptrFrom2dArray
        use :: spmf_enums,    only : spm_int_t, spmatrix_t
        implicit none
        integer(c_int),          intent(in)                      :: type
+       integer(c_int),          intent(in)                      :: flttype
        integer(kind=spm_int_t), intent(in)                      :: nrhs
        type(spmatrix_t),        intent(in),    target           :: spm
        class(*),                intent(inout), target, optional :: opt_X(:,:)
diff --git a/wrappers/julia/spm/src/spm.jl b/wrappers/julia/spm/src/spm.jl
index 65166de9..e34f5313 100644
--- a/wrappers/julia/spm/src/spm.jl
+++ b/wrappers/julia/spm/src/spm.jl
@@ -11,7 +11,7 @@
  @author Mathieu Faverge
  @author Selmane Lebdaoui
  @author Tony Delarue
- @date 2022-02-22
+ @date 2022-10-10
 
  This file has been automatically generated with gen_wrappers.py
 
@@ -139,7 +139,7 @@ end
 end
 
 @cbindings libspm begin
-    @cextern spmGenRHS( type::spm_rhstype_t, nrhs::spm_int_t, spm::Ptr{spmatrix_t}, opt_X::Ptr{Cvoid}, opt_ldx::spm_int_t, B::Ptr{Cvoid}, ldb::spm_int_t )::Cint
+    @cextern spmGenRHS( type::spm_rhstype_t, flttype::spm_coeftype_t, nrhs::spm_int_t, spm::Ptr{spmatrix_t}, opt_X::Ptr{Cvoid}, opt_ldx::spm_int_t, B::Ptr{Cvoid}, ldb::spm_int_t )::Cint
 end
 
 @cbindings libspm begin
diff --git a/wrappers/julia/spm/src/spm_enums.jl.in b/wrappers/julia/spm/src/spm_enums.jl.in
index 755d4b04..95ce0657 100644
--- a/wrappers/julia/spm/src/spm_enums.jl.in
+++ b/wrappers/julia/spm/src/spm_enums.jl.in
@@ -11,7 +11,7 @@
  @author Mathieu Faverge
  @author Selmane Lebdaoui
  @author Tony Delarue
- @date 2022-02-22
+ @date 2022-10-10
 
  This file has been automatically generated with gen_wrappers.py
 
diff --git a/wrappers/julia/spm_driver.jl b/wrappers/julia/spm_driver.jl
index 1ad73704..0cf83159 100755
--- a/wrappers/julia/spm_driver.jl
+++ b/wrappers/julia/spm_driver.jl
@@ -57,7 +57,7 @@ X0   = zeros( Cdouble, (n, nrhs) )
 B    = zeros( Cdouble, (n, nrhs) )
 X    = zeros( Cdouble, (n, nrhs) )
 
-spm.spmGenRHS( spm.SpmRhsRndX, nrhs, Aptr, X, n, B, n )
+spm.spmGenRHS( spm.SpmRhsRndX, A.flttype, nrhs, Aptr, X, n, B, n )
 
 # Copy x0 into x for backup
 X0 = copy(X)
diff --git a/wrappers/julia/spm_user.jl b/wrappers/julia/spm_user.jl
index 928b68f4..290b6f65 100755
--- a/wrappers/julia/spm_user.jl
+++ b/wrappers/julia/spm_user.jl
@@ -144,7 +144,7 @@ x0   = zeros( Cdouble, ( A.nexp, nrhs ) )
 b    = zeros( Cdouble, ( A.nexp, nrhs ) )
 x    = zeros( Cdouble, ( A.nexp, nrhs ) )
 
-spm.spmGenRHS( spm.SpmRhsRndX, nrhs, Aptr, x0, n, b, n )
+spm.spmGenRHS( spm.SpmRhsRndX, A.flttype, nrhs, Aptr, x0, n, b, n )
 
 # Copy x0 into x for backup
 x = x0
diff --git a/wrappers/python/spm/__spm__.py b/wrappers/python/spm/__spm__.py
index 9bf4b513..b6bf886e 100644
--- a/wrappers/python/spm/__spm__.py
+++ b/wrappers/python/spm/__spm__.py
@@ -11,7 +11,7 @@
  @author Pierre Ramet
  @author Mathieu Faverge
  @author Tony Delarue
- @date 2022-02-22
+ @date 2022-10-10
 
  This file has been automatically generated with gen_wrappers.py
 
@@ -217,11 +217,12 @@ def pyspm_spmGenVec( type, spm, alpha, seed, x, incx ):
     libspm.spmGenVec.restype = c_int
     return libspm.spmGenVec( type, spm, alpha, seed, x, incx )
 
-def pyspm_spmGenRHS( type, nrhs, spm, opt_X, opt_ldx, B, ldb ):
-    libspm.spmGenRHS.argtypes = [ c_int, __spm_int__, POINTER(pyspm_spmatrix_t),
-                                  c_void_p, __spm_int__, c_void_p, __spm_int__ ]
+def pyspm_spmGenRHS( type, flttype, nrhs, spm, opt_X, opt_ldx, B, ldb ):
+    libspm.spmGenRHS.argtypes = [ c_int, c_int, __spm_int__,
+                                  POINTER(pyspm_spmatrix_t), c_void_p,
+                                  __spm_int__, c_void_p, __spm_int__ ]
     libspm.spmGenRHS.restype = c_int
-    return libspm.spmGenRHS( type, nrhs, spm, opt_X, opt_ldx, B, ldb )
+    return libspm.spmGenRHS( type, flttype, nrhs, spm, opt_X, opt_ldx, B, ldb )
 
 def pyspm_spmCheckAxb( eps, nrhs, spm, opt_X0, opt_ldx0, B, ldb, X, ldx ):
     libspm.spmCheckAxb.argtypes = [ c_double, __spm_int__,
diff --git a/wrappers/python/spm/enum.py.in b/wrappers/python/spm/enum.py.in
index c54ac7aa..1fa51e42 100644
--- a/wrappers/python/spm/enum.py.in
+++ b/wrappers/python/spm/enum.py.in
@@ -11,7 +11,7 @@
  @author Pierre Ramet
  @author Mathieu Faverge
  @author Tony Delarue
- @date 2022-02-22
+ @date 2022-10-10
 
  This file has been automatically generated with gen_wrappers.py
 
diff --git a/wrappers/python/spm/spm.py b/wrappers/python/spm/spm.py
index 8be45587..239e4955 100644
--- a/wrappers/python/spm/spm.py
+++ b/wrappers/python/spm/spm.py
@@ -262,7 +262,7 @@ class spmatrix():
             ldx  = 1
             xptr = None
 
-        info = pyspm_spmGenRHS( rhstype, nrhs, self.id_ptr,
+        info = pyspm_spmGenRHS( rhstype, self.spm_c.flttype, nrhs, self.id_ptr,
                                 xptr, ldx, b.ctypes.data_as( c_void_p ), ldb )
         return x, b
 
-- 
GitLab