int PetscSparseMtrx :: assemble(const IntArray &loc, const FloatMatrix &mat) { int ndofe = mat.giveNumberOfRows(); #ifdef __PARALLEL_MODE if ( emodel->isParallel() ) { // translate local code numbers to global ones IntArray gloc(ndofe); emodel->givePetscContext(this->di, ut)->giveN2Gmap()->map2New(gloc, loc, 0); //fprintf (stderr, "[?] gloc="); //for (int i=1; i<=ndofe; i++) fprintf (stderr, "%d ", gloc.at(i)); MatSetValues(this->mtrx, ndofe, gloc.givePointer(), ndofe, gloc.givePointer(), mat.givePointer(), ADD_VALUES); } else { #endif IntArray gloc(ndofe); for ( int i = 1; i <= ndofe; i++ ) { gloc.at(i) = loc.at(i) - 1; } MatSetValues(this->mtrx, ndofe, gloc.givePointer(), ndofe, gloc.givePointer(), mat.givePointer(), ADD_VALUES); //mat.printYourself(); //loc.printYourself(); //MatView(this->mtrx,PETSC_VIEWER_STDOUT_SELF); #ifdef __PARALLEL_MODE } #endif this->version++; this->newValues = true; return 1; }
static void CVBBDDQJac(CVBBDPrecData pdata, realtype t, N_Vector y, N_Vector gy, N_Vector ytemp, N_Vector gtemp) { CVodeMem cv_mem; realtype gnorm, minInc, inc, inc_inv; long int group, i, j, width, ngroups, i1, i2; realtype *y_data, *ewt_data, *gy_data, *gtemp_data, *ytemp_data, *col_j; cv_mem = (CVodeMem) pdata->cvode_mem; /* Load ytemp with y = predicted solution vector */ N_VScale(ONE, y, ytemp); /* Call cfn and gloc to get base value of g(t,y) */ if (cfn != NULL) cfn (Nlocal, t, y, f_data); gloc(Nlocal, t, ytemp, gy, f_data); /* Obtain pointers to the data for various vectors */ y_data = N_VGetArrayPointer(y); gy_data = N_VGetArrayPointer(gy); ewt_data = N_VGetArrayPointer(ewt); ytemp_data = N_VGetArrayPointer(ytemp); gtemp_data = N_VGetArrayPointer(gtemp); /* Set minimum increment based on uround and norm of g */ gnorm = N_VWrmsNorm(gy, ewt); minInc = (gnorm != ZERO) ? (MIN_INC_MULT * ABS(h) * uround * Nlocal * gnorm) : ONE; /* Set bandwidth and number of column groups for band differencing */ width = mldq + mudq + 1; ngroups = MIN(width, Nlocal); /* Loop over groups */ for (group=1; group <= ngroups; group++) { /* Increment all y_j in group */ for(j=group-1; j < Nlocal; j+=width) { inc = MAX(dqrely*ABS(y_data[j]), minInc/ewt_data[j]); ytemp_data[j] += inc; } /* Evaluate g with incremented y */ gloc(Nlocal, t, ytemp, gtemp, f_data); /* Restore ytemp, then form and load difference quotients */ for (j=group-1; j < Nlocal; j+=width) { ytemp_data[j] = y_data[j]; col_j = BAND_COL(savedJ,j); inc = MAX(dqrely*ABS(y_data[j]), minInc/ewt_data[j]); inc_inv = ONE/inc; i1 = MAX(0, j-mukeep); i2 = MIN(j+mlkeep, Nlocal-1); for (i=i1; i <= i2; i++) BAND_COL_ELEM(col_j,i,j) = inc_inv * (gtemp_data[i] - gy_data[i]); } } }
static int KBBDDQJac(KBBDPrecData pdata, N_Vector uu, N_Vector uscale, N_Vector gu, N_Vector gtemp, N_Vector utemp) { realtype inc, inc_inv; long int group, i, j, width, ngroups, i1, i2; KINMem kin_mem; realtype *udata, *uscdata, *gudata, *gtempdata, *utempdata, *col_j; int retval; kin_mem = (KINMem) pdata->kin_mem; /* set pointers to the data for all vectors */ udata = N_VGetArrayPointer(uu); uscdata = N_VGetArrayPointer(uscale); gudata = N_VGetArrayPointer(gu); gtempdata = N_VGetArrayPointer(gtemp); utempdata = N_VGetArrayPointer(utemp); /* load utemp with uu = predicted solution vector */ N_VScale(ONE, uu, utemp); /* call gcomm and gloc to get base value of g(uu) */ if (gcomm != NULL) { retval = gcomm(Nlocal, uu, user_data); if (retval != 0) return(retval); } retval = gloc(Nlocal, uu, gu, user_data); if (retval != 0) return(retval); /* set bandwidth and number of column groups for band differencing */ width = mldq + mudq + 1; ngroups = SUNMIN(width, Nlocal); /* loop over groups */ for (group = 1; group <= ngroups; group++) { /* increment all u_j in group */ for(j = group - 1; j < Nlocal; j += width) { inc = rel_uu * SUNMAX(SUNRabs(udata[j]), (ONE / uscdata[j])); utempdata[j] += inc; } /* evaluate g with incremented u */ retval = gloc(Nlocal, utemp, gtemp, user_data); if (retval != 0) return(retval); /* restore utemp, then form and load difference quotients */ for (j = group - 1; j < Nlocal; j += width) { utempdata[j] = udata[j]; col_j = BAND_COL(PP,j); inc = rel_uu * SUNMAX(SUNRabs(udata[j]) , (ONE / uscdata[j])); inc_inv = ONE / inc; i1 = SUNMAX(0, (j - mukeep)); i2 = SUNMIN((j + mlkeep), (Nlocal - 1)); for (i = i1; i <= i2; i++) BAND_COL_ELEM(col_j, i, j) = inc_inv * (gtempdata[i] - gudata[i]); } } return(0); }