// InitC initialises a LinSolUmfpack data structure for Complex systems. It also performs some initial analyses. func (o *LinSolUmfpack) InitC(tC *TripletC, symmetric, verbose, timing bool) (err error) { // check o.tC = tC if tC.pos == 0 { return chk.Err(_linsol_umfpack_err02) } // flags o.name = "umfpack" o.sym = symmetric o.cmplx = true o.verb = verbose o.ton = timing // start time if o.ton { o.tini = time.Now() } // check x and z if len(o.tC.x) != len(o.tC.i) || len(o.tC.z) != len(o.tC.i) { return chk.Err(_linsol_umfpack_err03, len(o.tC.x), len(o.tC.z), len(o.tC.i)) } // pointers o.ti = (*C.LONG)(unsafe.Pointer(&o.tC.i[0])) o.tj = (*C.LONG)(unsafe.Pointer(&o.tC.j[0])) o.tx = (*C.double)(unsafe.Pointer(&o.tC.x[0])) o.tz = (*C.double)(unsafe.Pointer(&o.tC.z[0])) o.ap = (*C.LONG)(unsafe.Pointer(&make([]int, o.tC.n+1)[0])) o.ai = (*C.LONG)(unsafe.Pointer(&make([]int, o.tC.pos)[0])) o.ax = (*C.double)(unsafe.Pointer(&make([]float64, o.tC.pos)[0])) o.az = (*C.double)(unsafe.Pointer(&make([]float64, o.tC.pos)[0])) // control o.uctrl = (*C.double)(unsafe.Pointer(&make([]float64, C.UMFPACK_CONTROL)[0])) C.umfpack_zl_defaults(o.uctrl) // duration if o.ton { io.Pfcyan("%s: Time spent in LinSolUmfpack.InitC = %v\n", o.name, time.Now().Sub(o.tini)) } // success o.is_initialised = true return }
// initialise Umfpack control arrays func init() { _uctrl = (*C.double)(unsafe.Pointer(&_umfpctrl[0])) _uctrlz = (*C.double)(unsafe.Pointer(&_umfpctrlz[0])) C.umfpack_dl_defaults(_uctrl) C.umfpack_zl_defaults(_uctrlz) }