Esempio n. 1
0
int CVDense(void *cvode_mem, long int N)
{
    CVodeMem cv_mem;
    CVDenseMem cvdense_mem;

    /* Return immediately if cvode_mem is NULL */
    if (cvode_mem == NULL) {
        fprintf(stderr, MSGDS_CVMEM_NULL);
        return(CVDENSE_MEM_NULL);
    }
    cv_mem = (CVodeMem) cvode_mem;

    /* Test if the NVECTOR package is compatible with the DENSE solver */
    if (vec_tmpl->ops->nvgetarraypointer == NULL ||
            vec_tmpl->ops->nvsetarraypointer == NULL) {
        if(errfp!=NULL) fprintf(errfp, MSGDS_BAD_NVECTOR);
        return(CVDENSE_ILL_INPUT);
    }

    if (lfree !=NULL) lfree(cv_mem);

    /* Set four main function fields in cv_mem */
    linit  = CVDenseInit;
    lsetup = CVDenseSetup;
    lsolve = CVDenseSolve;
    lfree  = CVDenseFree;

    /* Get memory for CVDenseMemRec */
    cvdense_mem = (CVDenseMem) malloc(sizeof(CVDenseMemRec));
    if (cvdense_mem == NULL) {
        if(errfp!=NULL) fprintf(errfp, MSGDS_MEM_FAIL);
        return(CVDENSE_MEM_FAIL);
    }

    /* Set default Jacobian routine and Jacobian data */
    jac = CVDenseDQJac;
    J_data = cvode_mem;
    last_flag = CVDENSE_SUCCESS;

    setupNonNull = TRUE;

    /* Set problem dimension */
    n = N;

    /* Allocate memory for M, savedJ, and pivot array */

    M = DenseAllocMat(N);
    if (M == NULL) {
        if(errfp!=NULL) fprintf(errfp, MSGDS_MEM_FAIL);
        return(CVDENSE_MEM_FAIL);
    }
    savedJ = DenseAllocMat(N);
    if (savedJ == NULL) {
        if(errfp!=NULL) fprintf(errfp, MSGDS_MEM_FAIL);
        DenseFreeMat(M);
        return(CVDENSE_MEM_FAIL);
    }
    pivots = DenseAllocPiv(N);
    if (pivots == NULL) {
        if(errfp!=NULL) fprintf(errfp, MSGDS_MEM_FAIL);
        DenseFreeMat(M);
        DenseFreeMat(savedJ);
        return(CVDENSE_MEM_FAIL);
    }

    /* Attach linear solver memory to integrator memory */
    lmem = cvdense_mem;

    return(CVDENSE_SUCCESS);
}
int KINDense(void *kinmem, long int N)
{
  KINMem kin_mem;
  KINDenseMem kindense_mem;

  /* Return immediately if kinmem is NULL */
  if (kinmem == NULL) {
    KINProcessError(NULL, KINDENSE_MEM_NULL, "KINDENSE", "KINDense", MSGDS_KINMEM_NULL);
    return(KINDENSE_MEM_NULL);
  }
  kin_mem = (KINMem) kinmem;

  /* Test if the NVECTOR package is compatible with the DENSE solver */
  if (vec_tmpl->ops->nvgetarraypointer == NULL ||
      vec_tmpl->ops->nvsetarraypointer == NULL) {
    KINProcessError(kin_mem, KINDENSE_ILL_INPUT, "KINDENSE", "KINDense", MSGDS_BAD_NVECTOR);
    return(KINDENSE_ILL_INPUT);
  }

  if (lfree !=NULL) lfree(kin_mem);

  /* Set four main function fields in kin_mem */
  linit  = KINDenseInit;
  lsetup = KINDenseSetup;
  lsolve = KINDenseSolve;
  lfree  = KINDenseFree;

  /* Get memory for KINDenseMemRec */
  kindense_mem = NULL;
  kindense_mem = (KINDenseMem) malloc(sizeof(KINDenseMemRec));
  if (kindense_mem == NULL) {
    KINProcessError(kin_mem, KINDENSE_MEM_FAIL, "KINDENSE", "KINDense", MSGDS_MEM_FAIL);
    return(KINDENSE_MEM_FAIL);
  }

  /* Set default Jacobian routine and Jacobian data */
  jac = KINDenseDQJac;
  J_data = kin_mem;
  last_flag = KINDENSE_SUCCESS;

  setupNonNull = TRUE;

  /* Set problem dimension */
  n = N;

  /* Allocate memory for J and pivot array */
  
  J = NULL;
  J = DenseAllocMat(N, N);
  if (J == NULL) {
    KINProcessError(kin_mem, KINDENSE_MEM_FAIL, "KINDENSE", "KINDense", MSGDS_MEM_FAIL);
    free(kindense_mem); kindense_mem = NULL;
    return(KINDENSE_MEM_FAIL);
  }

  pivots = NULL;
  pivots = DenseAllocPiv(N);
  if (pivots == NULL) {
    KINProcessError(kin_mem, KINDENSE_MEM_FAIL, "KINDENSE", "KINDense", MSGDS_MEM_FAIL);
    DenseFreeMat(J);
    free(kindense_mem); kindense_mem = NULL;
    return(KINDENSE_MEM_FAIL);
  }

  /* This is a direct linear solver */
  inexact_ls = FALSE;

  /* Attach linear solver memory to integrator memory */
  lmem = kindense_mem;

  return(KINDENSE_SUCCESS);
}
Esempio n. 3
0
int CVDense(void *cvode_mem, CVDenseJacFn djac, void *jac_data)
{
  CVodeMem cv_mem;
  CVDenseMem cvdense_mem;

  /* Return immediately if cvode_mem is NULL */
  cv_mem = (CVodeMem) cvode_mem;
  if (cv_mem == NULL) {                   /* CVode reports this error */
    jsfprintf(errfp, MSG_CVMEM_NULL);
    return(LMEM_FAIL);
  }

  /* Test if the NVECTOR package is compatible with the DENSE solver */
  if ((strcmp(machenv->tag,"serial")) || 
      machenv->ops->nvmake    == NULL || 
      machenv->ops->nvdispose == NULL ||
      machenv->ops->nvgetdata == NULL || 
      machenv->ops->nvsetdata == NULL) {
    jsfprintf(errfp, MSG_WRONG_NVEC);
    return(LMEM_FAIL);
  }

  if (lfree !=NULL) lfree(cv_mem);

  /* Set four main function fields in cv_mem */
  linit  = CVDenseInit;
  lsetup = CVDenseSetup;
  lsolve = CVDenseSolve;
  lfree  = CVDenseFree;

  /* Get memory for CVDenseMemRec */
  lmem = cvdense_mem = (CVDenseMem) malloc(sizeof(CVDenseMemRec));
  if (cvdense_mem == NULL) {
    jsfprintf(errfp, MSG_MEM_FAIL);
    return(LMEM_FAIL);
  }

  /* Set Jacobian routine field, J_data, and setupNonNull */
  if (djac == NULL) {
    jac = CVDenseDQJac;
  } else {
    jac = djac;
  }
  J_data = jac_data;
  setupNonNull = TRUE;
  
  /* Allocate memory for M, savedJ, and pivot array */
  
  M = DenseAllocMat(N);
  if (M == NULL) {
    jsfprintf(errfp, MSG_MEM_FAIL);
    return(LMEM_FAIL);
  }
  savedJ = DenseAllocMat(N);
  if (savedJ == NULL) {
    jsfprintf(errfp, MSG_MEM_FAIL);
    DenseFreeMat(M);
    return(LMEM_FAIL);
  }
  pivots = DenseAllocPiv(N);
  if (pivots == NULL) {
    jsfprintf(errfp, MSG_MEM_FAIL);
    DenseFreeMat(M);
    DenseFreeMat(savedJ);
    return(LMEM_FAIL);
  }

  return(SUCCESS);
}