summaryrefslogtreecommitdiff
path: root/src/matrixOperations/division/sdiva.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/matrixOperations/division/sdiva.c')
-rw-r--r--src/matrixOperations/division/sdiva.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/matrixOperations/division/sdiva.c b/src/matrixOperations/division/sdiva.c
new file mode 100644
index 00000000..a20d14df
--- /dev/null
+++ b/src/matrixOperations/division/sdiva.c
@@ -0,0 +1,167 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008-2008 - INRIA - Allan SIMON
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+
+/**** WARNING NOT WORK AT ALL FOR THE MOMENT ***/
+/**** Because of problem of conversion float-> double ****/
+#include "matrixDivision.h"
+#include "lapack.h"
+#include "stdio.h"
+
+void srdiva ( float* in1, int lines1, int columns1 ,
+ float* in2, int lines2, int columns2 ,
+ float* out ){
+
+/* creation of all temp variable , maybe some of them are not accurate and could be deleted
+**/
+ int iexit = 0 ;
+ int iwork = 0 ;
+ int info = 0 ;
+ int imax = 0 ;
+ /*int rank = 0 ;*/
+
+ int tMinLinCol1 = 0 ;
+ int temp = 0;
+
+ int i = 0 , j = 0 ,ij = 0 ,ji = 0;
+
+
+ int* pIpiv = (int*) malloc( sizeof(int) * (unsigned int) columns1);
+ int* pIwork = (int*) malloc( sizeof(int) * (unsigned int) columns1);
+ /*int* pJpvt = (int*) malloc( sizeof(int) * (unsigned int) lines1);*/
+
+ double* work = NULL;
+ double anorm = 0;
+ double rcond = 0 ;
+ double epsilon = getRelativeMachinePrecision() ;
+
+
+
+
+ float* transpOfIn1 = (float*) malloc(sizeof(float) * (unsigned int) lines1 * (unsigned int) columns1);
+ float* transpOfIn2 = (float*) malloc(sizeof(float) * (unsigned int) lines2 * (unsigned int) columns2);
+
+ float* copyOfTransIn1 = (float*) malloc( sizeof(float) * (unsigned int) lines1 * (unsigned int) columns1);
+
+
+
+printf("\n>fin alloc \n");
+ if (lines1 > columns1)
+ tMinLinCol1 = columns1 ;
+ else
+ tMinLinCol1 = lines1;
+
+ if ( (tMinLinCol1 + 3 * lines1 + 1) > (2*tMinLinCol1 + lines2))
+ temp = tMinLinCol1 + 3 * lines1 + 1;
+ else
+ temp = 2*tMinLinCol1 + lines2;
+
+ if ( 4* columns1 > temp )
+ iwork = 4* columns1 ;
+ else
+ iwork = temp ;
+
+ work = (double*) malloc (sizeof(double) *(unsigned int) iwork );
+ printf("\n>debut partie rigolote \n");
+ anorm = getOneNorm( &lines1, &columns1 , (double* ) in1 , work);
+ printf("\n>debut partie rigolote 2\n");
+
+/* end of allocation area*/
+
+
+ stransposea ( in1, lines1, columns1, transpOfIn1);
+ stransposea ( in2, lines2, columns2, transpOfIn2) ;
+
+ if ( lines1 == columns1 )
+ {
+ srowcata ( in1, lines1, columns1, NULL, 0 , 0 , copyOfTransIn1 ) ;
+
+
+ /*/ put here algo of LU fact of in1 dgetrf ( &columns1 , &columns1 , in1 , &columns1 , pIpiv , &info )
+ //return value in pIpiv*/
+ dgetrf_ ( &columns1 , &columns1 , (double*) in1 , &columns1 , pIpiv , &info );
+
+ if ( info == 0 )
+ {
+ /*/to get 1-norm of in1 put here algo dgecon which return rcond*/
+ dgecon_("1" , &columns1, (double*) copyOfTransIn1 , &columns1, &anorm,
+ &rcond, work, pIwork, &info);
+
+ if ( rcond > sqrt(epsilon ))
+ {/* put here algo to resolv linear equation in1 * X = in2 , the return value go in in2
+ // put here algo to copy in2 in out */
+ resolveSystemLinear (&columns1, &lines2,(double*) copyOfTransIn1, pIpiv,
+ (double* )transpOfIn2, &info) ;
+ stransposea ( transpOfIn2 , columns2 , lines2 , out) ;
+ iexit = 1;
+ }
+
+ }
+
+
+ }
+
+ if ( iexit== 0)
+ {
+ rcond = sqrt(epsilon );
+ if (lines1 < columns1)
+ imax = columns1 ;
+ else
+ imax = lines1;
+
+
+/* cette fonction genere des nombres aleatoires , youpi ! */
+ /* dgelsy_ (&columns1, &lines1, &lines2, (double*) transpOfIn1 , &columns1,
+ (double*) transpOfIn2, &imax, pJpvt, &rcond, &rank, work,
+ &iwork, &info);*/
+
+
+
+ for(j = 0 ; j < lines1 ; j++)
+ {
+ for(i = 0 ; i < lines2 ; i++)
+ {
+ ij = i + j * lines2;
+ if ( lines1 > columns1 )
+ ji = j + i *lines1 ;
+ else
+ ji = j + i *columns1;
+ out[ij] = transpOfIn2[ji];
+ }
+ }
+
+
+ /* here put algo dgelsy1 which do maybe interesting things but i dunno what
+
+ // if info return by dgelsy1 != 0
+ // return ;*/
+
+
+
+ }
+
+ printf("\n>debut partie 2\n");
+
+
+ /* then we free all the allocated memory */
+
+ free ( pIpiv ) ;
+ free ( pIwork) ;
+ free ( work ) ;
+
+ /* le probleme vient de ces trois free */
+ free (transpOfIn1) ;
+ free (transpOfIn2) ;
+ free (copyOfTransIn1);
+
+}
+