diff liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c @ 5164:57077d0ddc8e

[project @ 2005-02-25 19:55:24 by jwe]
author jwe
date Fri, 25 Feb 2005 19:55:28 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,69 @@
+/* ========================================================================== */
+/* === UMF_fsize ============================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Determine the largest frontal matrix size for each subtree.   Called by
+ * UMF_colamd and UMF_analyze.  Only required to sort the children of each
+ * node prior to AMD_postorder. */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_fsize
+(
+    Int nn,
+    Int Fsize [ ],
+    Int Fnrows [ ],
+    Int Fncols [ ],
+    Int Parent [ ],
+    Int Npiv [ ]
+)
+{
+    Int j, parent, frsize, r, c ;
+
+    for (j = 0 ; j < nn ; j++)
+    {
+	Fsize [j] = EMPTY ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* find max front size for tree rooted at node j, for each front j */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG1 (("\n\n========================================FRONTS:\n")) ;
+    for (j = 0 ; j < nn ; j++)
+    {
+	if (Npiv [j] > 0)
+	{
+	    /* this is a frontal matrix */
+	    parent = Parent [j] ;
+	    r = Fnrows [j] ;
+	    c = Fncols [j] ;
+	    frsize = r * c ;
+	    /* avoid integer overflow */
+	    if (INT_OVERFLOW (((double) r) * ((double) c)))
+	    {
+		/* :: frsize int overflow :: */
+		frsize = Int_MAX ;
+	    }
+	    DEBUG1 ((""ID" : npiv "ID" size "ID" parent "ID" ",
+		j, Npiv [j], frsize, parent)) ;
+	    Fsize [j] = MAX (Fsize [j], frsize) ;
+	    DEBUG1 (("Fsize [j = "ID"] = "ID"\n", j, Fsize [j])) ;
+	    if (parent != EMPTY)
+	    {
+		/* find the maximum frontsize of self and children */
+		ASSERT (Npiv [parent] > 0) ;
+		ASSERT (parent > j) ;
+		Fsize [parent] = MAX (Fsize [parent], Fsize [j]) ;
+		DEBUG1 (("Fsize [parent = "ID"] = "ID"\n",
+		    parent, Fsize [parent]));
+	    }
+	}
+    }
+}