Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/opennl/superlu/ssnode_dfs.c')
-rw-r--r--intern/opennl/superlu/ssnode_dfs.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/intern/opennl/superlu/ssnode_dfs.c b/intern/opennl/superlu/ssnode_dfs.c
new file mode 100644
index 00000000000..c8974237a9a
--- /dev/null
+++ b/intern/opennl/superlu/ssnode_dfs.c
@@ -0,0 +1,106 @@
+
+
+/*
+ * -- SuperLU routine (version 2.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November 15, 1997
+ *
+ */
+/*
+ Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+
+ THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+ Permission is hereby granted to use or copy this program for any
+ purpose, provided the above notices are retained on all copies.
+ Permission to modify the code and to distribute modified code is
+ granted, provided the above notices are retained, and a notice that
+ the code was modified is included with the above copyright notice.
+*/
+
+#include "ssp_defs.h"
+#include "util.h"
+
+int
+ssnode_dfs (
+ const int jcol, /* in - start of the supernode */
+ const int kcol, /* in - end of the supernode */
+ const int *asub, /* in */
+ const int *xa_begin, /* in */
+ const int *xa_end, /* in */
+ int *xprune, /* out */
+ int *marker, /* modified */
+ GlobalLU_t *Glu /* modified */
+ )
+{
+/* Purpose
+ * =======
+ * ssnode_dfs() - Determine the union of the row structures of those
+ * columns within the relaxed snode.
+ * Note: The relaxed snodes are leaves of the supernodal etree, therefore,
+ * the portion outside the rectangular supernode must be zero.
+ *
+ * Return value
+ * ============
+ * 0 success;
+ * >0 number of bytes allocated when run out of memory.
+ *
+ */
+ register int i, k, ifrom, ito, nextl, new_next;
+ int nsuper, krow, kmark, mem_error;
+ int *xsup, *supno;
+ int *lsub, *xlsub;
+ int nzlmax;
+
+ xsup = Glu->xsup;
+ supno = Glu->supno;
+ lsub = Glu->lsub;
+ xlsub = Glu->xlsub;
+ nzlmax = Glu->nzlmax;
+
+ nsuper = ++supno[jcol]; /* Next available supernode number */
+ nextl = xlsub[jcol];
+
+ for (i = jcol; i <= kcol; i++) {
+ /* For each nonzero in A[*,i] */
+ for (k = xa_begin[i]; k < xa_end[i]; k++) {
+ krow = asub[k];
+ kmark = marker[krow];
+ if ( kmark != kcol ) { /* First time visit krow */
+ marker[krow] = kcol;
+ lsub[nextl++] = krow;
+ if ( nextl >= nzlmax ) {
+ if ( (mem_error = sLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu)) )
+ return (mem_error);
+ lsub = Glu->lsub;
+ }
+ }
+ }
+ supno[i] = nsuper;
+ }
+
+ /* Supernode > 1, then make a copy of the subscripts for pruning */
+ if ( jcol < kcol ) {
+ new_next = nextl + (nextl - xlsub[jcol]);
+ while ( new_next > nzlmax ) {
+ if ( (mem_error = sLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu)) )
+ return (mem_error);
+ lsub = Glu->lsub;
+ }
+ ito = nextl;
+ for (ifrom = xlsub[jcol]; ifrom < nextl; )
+ lsub[ito++] = lsub[ifrom++];
+ for (i = jcol+1; i <= kcol; i++) xlsub[i] = nextl;
+ nextl = ito;
+ }
+
+ xsup[nsuper+1] = kcol + 1;
+ supno[kcol+1] = nsuper;
+ xprune[kcol] = nextl;
+ xlsub[kcol+1] = nextl;
+
+ return 0;
+}
+