/* ========================================================================== */1/* === umf4_f77zwrapper ===================================================== */2/* ========================================================================== */34/* -------------------------------------------------------------------------- */5/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */6/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */7/* web: http://www.cise.ufl.edu/research/sparse/umfpack */8/* -------------------------------------------------------------------------- */910/* FORTRAN interface for the C-callable UMFPACK library (complex / int version11* only and complex / long versions only). This is HIGHLY non-portable. You12* will need to modify this depending on how your FORTRAN and C compilers13* behave.14*15* See umf4z_f77wrapper.c for more information.16*17* The complex values are provided in two separate arrays. Ax contains the18* real part and Az contains the imaginary part. The solution vector is in19* x (the real part) and xz (the imaginary part. b is the real part of the20* right-hand-side and bz is the imaginary part. Does not support the21* packed complex type.22*/2324#include "umfpack.h"25#include <ctype.h>26#include <stdio.h>27#ifdef NULL28#undef NULL29#endif30#define NULL 031#define LEN 2003233/* -------------------------------------------------------------------------- */34/* integer type: int or long */35/* -------------------------------------------------------------------------- */3637#if defined (ZLONG)3839#define Int long40#define UMFPACK_defaults umfpack_zl_defaults41#define UMFPACK_free_numeric umfpack_zl_free_numeric42#define UMFPACK_free_symbolic umfpack_zl_free_symbolic43#define UMFPACK_numeric umfpack_zl_numeric44#define UMFPACK_report_control umfpack_zl_report_control45#define UMFPACK_report_info umfpack_zl_report_info46#define UMFPACK_save_numeric umfpack_zl_save_numeric47#define UMFPACK_save_symbolic umfpack_zl_save_symbolic48#define UMFPACK_load_numeric umfpack_zl_load_numeric49#define UMFPACK_load_symbolic umfpack_zl_load_symbolic50#define UMFPACK_scale umfpack_zl_scale51#define UMFPACK_solve umfpack_zl_solve52#define UMFPACK_symbolic umfpack_zl_symbolic5354#else5556#define Int int57#define UMFPACK_defaults umfpack_zi_defaults58#define UMFPACK_free_numeric umfpack_zi_free_numeric59#define UMFPACK_free_symbolic umfpack_zi_free_symbolic60#define UMFPACK_numeric umfpack_zi_numeric61#define UMFPACK_report_control umfpack_zi_report_control62#define UMFPACK_report_info umfpack_zi_report_info63#define UMFPACK_save_numeric umfpack_zi_save_numeric64#define UMFPACK_save_symbolic umfpack_zi_save_symbolic65#define UMFPACK_load_numeric umfpack_zi_load_numeric66#define UMFPACK_load_symbolic umfpack_zi_load_symbolic67#define UMFPACK_scale umfpack_zi_scale68#define UMFPACK_solve umfpack_zi_solve69#define UMFPACK_symbolic umfpack_zi_symbolic7071#endif7273/* -------------------------------------------------------------------------- */74/* construct a file name from a file number (not user-callable) */75/* -------------------------------------------------------------------------- */7677static void make_filename (Int filenum, char *prefix, char *filename)78{79char *psrc, *pdst ;80#ifdef ZLONG81sprintf (filename, "%s%ld.umf", prefix, filenum) ;82#else83sprintf (filename, "%s%d.umf", prefix, filenum) ;84#endif85/* remove any spaces in the filename */86pdst = filename ;87for (psrc = filename ; *psrc ; psrc++)88{89if (!isspace (*psrc)) *pdst++ = *psrc ;90}91*pdst = '\0' ;92}9394/* ========================================================================== */95/* === with underscore ====================================================== */96/* ========================================================================== */9798/* Solaris, Linux, and SGI IRIX. Probably Compaq Alpha as well. */99100/* -------------------------------------------------------------------------- */101/* umf4zdef: set default control parameters */102/* -------------------------------------------------------------------------- */103104/* call umf4zdef (control) */105106void umf4zdef_ (double Control [UMFPACK_CONTROL])107{108UMFPACK_defaults (Control) ;109}110111/* -------------------------------------------------------------------------- */112/* umf4zpcon: print control parameters */113/* -------------------------------------------------------------------------- */114115/* call umf4zpcon (control) */116117void umf4zpcon_ (double Control [UMFPACK_CONTROL])118{119fflush (stdout) ;120UMFPACK_report_control (Control) ;121fflush (stdout) ;122}123124/* -------------------------------------------------------------------------- */125/* umf4zsym: pre-ordering and symbolic factorization */126/* -------------------------------------------------------------------------- */127128/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */129130void umf4zsym_ (Int *m, Int *n, Int Ap [ ], Int Ai [ ],131double Ax [ ], double Az [ ], void **Symbolic,132double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])133{134(void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ;135}136137/* -------------------------------------------------------------------------- */138/* umf4znum: numeric factorization */139/* -------------------------------------------------------------------------- */140141/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */142143void umf4znum_ (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],144void **Symbolic, void **Numeric,145double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])146{147(void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info);148}149150/* -------------------------------------------------------------------------- */151/* umf4zsolr: solve a linear system with iterative refinement */152/* -------------------------------------------------------------------------- */153154/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */155156void umf4zsolr_ (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],157double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric,158double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])159{160(void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz,161*Numeric, Control, Info) ;162}163164/* -------------------------------------------------------------------------- */165/* umf4zsol: solve a linear system without iterative refinement */166/* -------------------------------------------------------------------------- */167168/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */169170void umf4zsol_ (Int *sys, double x [ ], double xz [ ], double b [ ],171double bz [ ], void **Numeric,172double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])173{174Control [UMFPACK_IRSTEP] = 0 ;175(void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,176(double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ;177}178179/* -------------------------------------------------------------------------- */180/* umf4zscal: scale a vector using UMFPACK's scale factors */181/* -------------------------------------------------------------------------- */182183/* call umf4zscal (x, xz, b, bz, numeric, status) */184185void umf4zscal_ (double x [ ], double xz [ ], double b [ ], double bz [ ],186void **Numeric, Int *status)187{188*status = UMFPACK_scale (x, xz, b, bz, *Numeric) ;189}190191/* -------------------------------------------------------------------------- */192/* umf4zpinf: print info */193/* -------------------------------------------------------------------------- */194195/* call umf4zpinf (control) */196197void umf4zpinf_ (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])198{199fflush (stdout) ;200UMFPACK_report_info (Control, Info) ;201fflush (stdout) ;202}203204/* -------------------------------------------------------------------------- */205/* umf4zfnum: free the Numeric object */206/* -------------------------------------------------------------------------- */207208/* call umf4zfnum (numeric) */209210void umf4zfnum_ (void **Numeric)211{212UMFPACK_free_numeric (Numeric) ;213}214215/* -------------------------------------------------------------------------- */216/* umf4zfsym: free the Symbolic object */217/* -------------------------------------------------------------------------- */218219/* call umf4zfsym (symbolic) */220221void umf4zfsym_ (void **Symbolic)222{223UMFPACK_free_symbolic (Symbolic) ;224}225226/* -------------------------------------------------------------------------- */227/* umf4zsnum: save the Numeric object to a file */228/* -------------------------------------------------------------------------- */229230/* call umf4zsnum (numeric, filenum, status) */231232void umf4zsnum_ (void **Numeric, Int *filenum, Int *status)233{234char filename [LEN] ;235make_filename (*filenum, "n", filename) ;236*status = UMFPACK_save_numeric (*Numeric, filename) ;237}238239/* -------------------------------------------------------------------------- */240/* umf4zssym: save the Symbolic object to a file */241/* -------------------------------------------------------------------------- */242243/* call umf4zssym (symbolic, filenum, status) */244245void umf4zssym_ (void **Symbolic, Int *filenum, Int *status)246{247char filename [LEN] ;248make_filename (*filenum, "s", filename) ;249*status = UMFPACK_save_symbolic (*Symbolic, filename) ;250}251252/* -------------------------------------------------------------------------- */253/* umf4zlnum: load the Numeric object from a file */254/* -------------------------------------------------------------------------- */255256/* call umf4zlnum (numeric, filenum, status) */257258void umf4zlnum_ (void **Numeric, Int *filenum, Int *status)259{260char filename [LEN] ;261make_filename (*filenum, "n", filename) ;262*status = UMFPACK_load_numeric (Numeric, filename) ;263}264265/* -------------------------------------------------------------------------- */266/* umf4zlsym: load the Symbolic object from a file */267/* -------------------------------------------------------------------------- */268269/* call umf4zlsym (symbolic, filenum, status) */270271void umf4zlsym_ (void **Symbolic, Int *filenum, Int *status)272{273char filename [LEN] ;274make_filename (*filenum, "s", filename) ;275*status = UMFPACK_load_symbolic (Symbolic, filename) ;276}277278/* ========================================================================== */279/* === with no underscore =================================================== */280/* ========================================================================== */281282/* IBM AIX. Probably Microsoft Windows and HP Unix as well. */283284/* -------------------------------------------------------------------------- */285/* umf4zdef: set default control parameters */286/* -------------------------------------------------------------------------- */287288/* call umf4zdef (control) */289290void umf4zdef (double Control [UMFPACK_CONTROL])291{292UMFPACK_defaults (Control) ;293}294295/* -------------------------------------------------------------------------- */296/* umf4zpcon: print control parameters */297/* -------------------------------------------------------------------------- */298299/* call umf4zpcon (control) */300301void umf4zpcon (double Control [UMFPACK_CONTROL])302{303fflush (stdout) ;304UMFPACK_report_control (Control) ;305fflush (stdout) ;306}307308/* -------------------------------------------------------------------------- */309/* umf4zsym: pre-ordering and symbolic factorization */310/* -------------------------------------------------------------------------- */311312/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */313314void umf4zsym (Int *m, Int *n, Int Ap [ ], Int Ai [ ],315double Ax [ ], double Az [ ], void **Symbolic,316double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])317{318(void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ;319}320321/* -------------------------------------------------------------------------- */322/* umf4znum: numeric factorization */323/* -------------------------------------------------------------------------- */324325/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */326327void umf4znum (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],328void **Symbolic, void **Numeric,329double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])330{331(void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info);332}333334/* -------------------------------------------------------------------------- */335/* umf4zsolr: solve a linear system with iterative refinement */336/* -------------------------------------------------------------------------- */337338/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */339340void umf4zsolr (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],341double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric,342double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])343{344(void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz,345*Numeric, Control, Info) ;346}347348/* -------------------------------------------------------------------------- */349/* umf4zsol: solve a linear system without iterative refinement */350/* -------------------------------------------------------------------------- */351352/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */353354void umf4zsol (Int *sys, double x [ ], double xz [ ], double b [ ],355double bz [ ], void **Numeric,356double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])357{358Control [UMFPACK_IRSTEP] = 0 ;359(void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,360(double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ;361}362363/* -------------------------------------------------------------------------- */364/* umf4zscal: scale a vector using UMFPACK's scale factors */365/* -------------------------------------------------------------------------- */366367/* call umf4zscal (x, xz, b, bz, numeric, status) */368369void umf4zscal (double x [ ], double xz [ ], double b [ ], double bz [ ],370void **Numeric, Int *status)371{372*status = UMFPACK_scale (x, xz, b, bz, *Numeric) ;373}374375/* -------------------------------------------------------------------------- */376/* umf4zpinf: print info */377/* -------------------------------------------------------------------------- */378379/* call umf4zpinf (control) */380381void umf4zpinf (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])382{383fflush (stdout) ;384UMFPACK_report_info (Control, Info) ;385fflush (stdout) ;386}387388/* -------------------------------------------------------------------------- */389/* umf4zfnum: free the Numeric object */390/* -------------------------------------------------------------------------- */391392/* call umf4zfnum (numeric) */393394void umf4zfnum (void **Numeric)395{396UMFPACK_free_numeric (Numeric) ;397}398399/* -------------------------------------------------------------------------- */400/* umf4zfsym: free the Symbolic object */401/* -------------------------------------------------------------------------- */402403/* call umf4zfsym (symbolic) */404405void umf4zfsym (void **Symbolic)406{407UMFPACK_free_symbolic (Symbolic) ;408}409410/* -------------------------------------------------------------------------- */411/* umf4zsnum: save the Numeric object to a file */412/* -------------------------------------------------------------------------- */413414/* call umf4zsnum (numeric, filenum, status) */415416void umf4zsnum (void **Numeric, Int *filenum, Int *status)417{418char filename [LEN] ;419make_filename (*filenum, "n", filename) ;420*status = UMFPACK_save_numeric (*Numeric, filename) ;421}422423/* -------------------------------------------------------------------------- */424/* umf4zssym: save the Symbolic object to a file */425/* -------------------------------------------------------------------------- */426427/* call umf4zssym (symbolic, filenum, status) */428429void umf4zssym (void **Symbolic, Int *filenum, Int *status)430{431char filename [LEN] ;432make_filename (*filenum, "s", filename) ;433*status = UMFPACK_save_symbolic (*Symbolic, filename) ;434}435436/* -------------------------------------------------------------------------- */437/* umf4zlnum: load the Numeric object from a file */438/* -------------------------------------------------------------------------- */439440/* call umf4zlnum (numeric, filenum, status) */441442void umf4zlnum (void **Numeric, Int *filenum, Int *status)443{444char filename [LEN] ;445make_filename (*filenum, "n", filename) ;446*status = UMFPACK_load_numeric (Numeric, filename) ;447}448449/* -------------------------------------------------------------------------- */450/* umf4zlsym: load the Symbolic object from a file */451/* -------------------------------------------------------------------------- */452453/* call umf4zlsym (symbolic, filenum, status) */454455void umf4zlsym (void **Symbolic, Int *filenum, Int *status)456{457char filename [LEN] ;458make_filename (*filenum, "s", filename) ;459*status = UMFPACK_load_symbolic (Symbolic, filename) ;460}461462463464