Пример #1
0
int main()
{
    UserData data;
    realtype fnormtol, scsteptol;
    N_Vector u1, u2, u, s, c;
    int glstr, mset, flag;
    void *kmem;

    u1 = u2 = u = NULL;
    s = c = NULL;
    kmem = NULL;
    data = NULL;

    /* User data */

    data = (UserData)malloc(sizeof *data);
    data->lb[0] = PT25;
    data->ub[0] = ONE;
    data->lb[1] = ONEPT5;
    data->ub[1] = TWO*PI;
    data->nnz = 12;

    /* Create serial vectors of length NEQ */
    u1 = N_VNew_Serial(NEQ);
    if (check_flag((void *)u1, "N_VNew_Serial", 0)) return(1);

    u2 = N_VNew_Serial(NEQ);
    if (check_flag((void *)u2, "N_VNew_Serial", 0)) return(1);

    u = N_VNew_Serial(NEQ);
    if (check_flag((void *)u, "N_VNew_Serial", 0)) return(1);

    s = N_VNew_Serial(NEQ);
    if (check_flag((void *)s, "N_VNew_Serial", 0)) return(1);

    c = N_VNew_Serial(NEQ);
    if (check_flag((void *)c, "N_VNew_Serial", 0)) return(1);

    SetInitialGuess1(u1,data);
    SetInitialGuess2(u2,data);

    N_VConst_Serial(ONE,s); /* no scaling */

    NV_Ith_S(c,0) =  ZERO;   /* no constraint on x1 */
    NV_Ith_S(c,1) =  ZERO;   /* no constraint on x2 */
    NV_Ith_S(c,2) =  ONE;    /* l1 = x1 - x1_min >= 0  */
    NV_Ith_S(c,3) = -ONE;    /* L1 = x1 - x1_max <= 0  */
    NV_Ith_S(c,4) =  ONE;    /* l2 = x2 - x2_min >= 0  */
    NV_Ith_S(c,5) = -ONE;    /* L2 = x2 - x22_min <= 0 */

    fnormtol=FTOL;
    scsteptol=STOL;


    kmem = KINCreate();
    if (check_flag((void *)kmem, "KINCreate", 0)) return(1);

    flag = KINSetUserData(kmem, data);
    if (check_flag(&flag, "KINSetUserData", 1)) return(1);
    flag = KINSetConstraints(kmem, c);
    if (check_flag(&flag, "KINSetConstraints", 1)) return(1);
    flag = KINSetFuncNormTol(kmem, fnormtol);
    if (check_flag(&flag, "KINSetFuncNormTol", 1)) return(1);
    flag = KINSetScaledStepTol(kmem, scsteptol);
    if (check_flag(&flag, "KINSetScaledStepTol", 1)) return(1);

    flag = KINInit(kmem, func, u);
    if (check_flag(&flag, "KINInit", 1)) return(1);

    /* Call KINDense to specify the linear solver */
    /*
     * flag = KINDense(kmem, NEQ); // <-- Replace with KINKLU
     * if (check_flag(&flag, "KINDense", 1)) return(1);
     * flag = KINDlsSetDenseJacFn(kmem, jacDense);
     * if (check_flag(&flag, "KINDlsSetDenseJacFn", 1)) return(1);
     */

    /* Attach KLU linear solver, which uses CSR matrix */
    flag = KINKLU(kmem, NEQ, data->nnz, CSR_MAT);
    if (check_flag(&flag, "KINKLU", 1)) return(1);

    flag = KINSlsSetSparseJacFn(kmem, jac);
    if (check_flag(&flag, "KINSlsSetSparseJacFn", 1)) return(1);

    /* Print out the problem size, solution parameters, initial guess. */
    PrintHeader(fnormtol, scsteptol);

    /* --------------------------- */

    printf("\n------------------------------------------\n");
    printf("\nInitial guess on lower bounds\n");
    printf("  [x1,x2] = ");
    PrintOutput(u1);

    N_VScale_Serial(ONE,u1,u);
    glstr = KIN_NONE;
    mset = 1;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u1,u);
    glstr = KIN_LINESEARCH;
    mset = 1;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u1,u);
    glstr = KIN_NONE;
    mset = 0;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u1,u);
    glstr = KIN_LINESEARCH;
    mset = 0;
    SolveIt(kmem, u, s, glstr, mset);



    /* --------------------------- */

    printf("\n------------------------------------------\n");
    printf("\nInitial guess in middle of feasible region\n");
    printf("  [x1,x2] = ");
    PrintOutput(u2);

    N_VScale_Serial(ONE,u2,u);
    glstr = KIN_NONE;
    mset = 1;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u2,u);
    glstr = KIN_LINESEARCH;
    mset = 1;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u2,u);
    glstr = KIN_NONE;
    mset = 0;
    SolveIt(kmem, u, s, glstr, mset);

    /* --------------------------- */

    N_VScale_Serial(ONE,u2,u);
    glstr = KIN_LINESEARCH;
    mset = 0;
    SolveIt(kmem, u, s, glstr, mset);




    /* Free memory */

    N_VDestroy_Serial(u1);
    N_VDestroy_Serial(u2);
    N_VDestroy_Serial(u);
    N_VDestroy_Serial(s);
    N_VDestroy_Serial(c);
    KINFree(&kmem);
    free(data);

    return(0);
}
Пример #2
0
int nlsKinsolAllocate(int size, NONLINEAR_SYSTEM_DATA *nlsData, int linearSolverMethod)
{
  int i, flag, printLevel;

  NLS_KINSOL_DATA *kinsolData = (NLS_KINSOL_DATA*) malloc(sizeof(NLS_KINSOL_DATA));

  /* allocate system data */
  nlsData->solverData = (void*)kinsolData;

  kinsolData->size = size;
  kinsolData->linearSolverMethod = linearSolverMethod;
  kinsolData->solved = 0;

  kinsolData->fnormtol  = sqrt(newtonFTol);     /* function tolerance */
  kinsolData->scsteptol = sqrt(newtonXTol);     /* step tolerance */

  kinsolData->initialGuess = N_VNew_Serial(size);
  kinsolData->xScale = N_VNew_Serial(size);
  kinsolData->fScale = N_VNew_Serial(size);
  kinsolData->fRes = N_VNew_Serial(size);

  kinsolData->kinsolMemory = KINCreate();

  /* setup user defined functions */
  KINSetErrHandlerFn(kinsolData->kinsolMemory, nlsKinsolErrorPrint, kinsolData);
  KINSetInfoHandlerFn(kinsolData->kinsolMemory, nlsKinsolInfoPrint, kinsolData);
  KINSetUserData(kinsolData->kinsolMemory, (void*)&(kinsolData->userData));
  flag = KINInit(kinsolData->kinsolMemory, nlsKinsolResiduals, kinsolData->initialGuess);
  if (checkReturnFlag(flag)){
    errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL solver!");
  }

  /* Specify linear solver and/or corresponding jacobian function*/
  if (kinsolData->linearSolverMethod == 3)
  {
    if(nlsData->isPatternAvailable)
    {
      kinsolData->nnz = nlsData->sparsePattern.numberOfNoneZeros;
      flag = KINKLU(kinsolData->kinsolMemory, size, kinsolData->nnz);
      if (checkReturnFlag(flag)){
        errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL solver!");
      }
      flag = KINSlsSetSparseJacFn(kinsolData->kinsolMemory, nlsSparseJac);
      if (checkReturnFlag(flag)){
        errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL Sparse Solver!");
      }
    }
    else
    {
      flag = KINDense(kinsolData->kinsolMemory, size);
      if (checkReturnFlag(flag)){
        errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL solver!");
      }
    }
  }
  else if (kinsolData->linearSolverMethod == 1)
  {
    flag = KINDense(kinsolData->kinsolMemory, size);
    if (checkReturnFlag(flag)){
      errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL solver!");
    }
  }
  else if (kinsolData->linearSolverMethod == 2)
  {
    flag = KINDense(kinsolData->kinsolMemory, size);
    if (checkReturnFlag(flag)){
      errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL solver!");
    }
    flag = KINDlsSetDenseJacFn(kinsolData->kinsolMemory, nlsDenseJac);
    if (checkReturnFlag(flag)){
      errorStreamPrint(LOG_STDOUT, 0, "##KINSOL## Something goes wrong while initialize KINSOL Sparse Solver!");
    }
  }

  /* configuration */
  nlsKinsolConfigSetup(kinsolData);

  /* debug print level of kinsol */
  if (ACTIVE_STREAM(LOG_NLS))
    printLevel = 1;
  else if (ACTIVE_STREAM(LOG_NLS_V))
    printLevel = 3;
  else
    printLevel = 0;
  KINSetPrintLevel(kinsolData->kinsolMemory, printLevel);

  return 0;
}
Пример #3
0
/* Fortran interface to C routine KINSlsSetSparseJacFn; see
   fkinsol.h for further information */
void FKIN_SPARSESETJAC(int *ier)
{
  *ier = KINSlsSetSparseJacFn(KIN_kinmem, FKINSparseJac);
}