1*bdad233fSMatthew Knepley #ifdef PETSC_RCS_HEADER 2*bdad233fSMatthew Knepley static char vcid[] = "$Id: gridcreate.c,v 1.7 2000/01/10 03:54:25 knepley Exp $"; 3*bdad233fSMatthew Knepley #endif 4*bdad233fSMatthew Knepley 5*bdad233fSMatthew Knepley #include "src/grid/gridimpl.h" /*I "grid.h" I*/ 6*bdad233fSMatthew Knepley 7*bdad233fSMatthew Knepley #undef __FUNCT__ 8*bdad233fSMatthew Knepley #define __FUNCT__ "TSPublish_Petsc" 9*bdad233fSMatthew Knepley static int TSPublish_Petsc(PetscObject obj) 10*bdad233fSMatthew Knepley { 11*bdad233fSMatthew Knepley #if defined(PETSC_HAVE_AMS) 12*bdad233fSMatthew Knepley TS v = (TS) obj; 13*bdad233fSMatthew Knepley int ierr; 14*bdad233fSMatthew Knepley #endif 15*bdad233fSMatthew Knepley 16*bdad233fSMatthew Knepley PetscFunctionBegin; 17*bdad233fSMatthew Knepley 18*bdad233fSMatthew Knepley #if defined(PETSC_HAVE_AMS) 19*bdad233fSMatthew Knepley /* if it is already published then return */ 20*bdad233fSMatthew Knepley if (v->amem >=0) PetscFunctionReturn(0); 21*bdad233fSMatthew Knepley 22*bdad233fSMatthew Knepley ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr); 23*bdad233fSMatthew Knepley ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Step",&v->steps,1,AMS_INT,AMS_READ, 24*bdad233fSMatthew Knepley AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 25*bdad233fSMatthew Knepley ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Time",&v->ptime,1,AMS_DOUBLE,AMS_READ, 26*bdad233fSMatthew Knepley AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 27*bdad233fSMatthew Knepley ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"CurrentTimeStep",&v->time_step,1, 28*bdad233fSMatthew Knepley AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 29*bdad233fSMatthew Knepley ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr); 30*bdad233fSMatthew Knepley #endif 31*bdad233fSMatthew Knepley PetscFunctionReturn(0); 32*bdad233fSMatthew Knepley } 33*bdad233fSMatthew Knepley 34*bdad233fSMatthew Knepley #undef __FUNCT__ 35*bdad233fSMatthew Knepley #define __FUNCT__ "TSCreate" 36*bdad233fSMatthew Knepley /*@ 37*bdad233fSMatthew Knepley TSCreate - This function creates an empty timestepper. The type can then be set with TSSetType(). 38*bdad233fSMatthew Knepley 39*bdad233fSMatthew Knepley Collective on MPI_Comm 40*bdad233fSMatthew Knepley 41*bdad233fSMatthew Knepley Input Parameter: 42*bdad233fSMatthew Knepley . comm - The communicator 43*bdad233fSMatthew Knepley 44*bdad233fSMatthew Knepley Output Parameter: 45*bdad233fSMatthew Knepley . ts - The TS 46*bdad233fSMatthew Knepley 47*bdad233fSMatthew Knepley Level: beginner 48*bdad233fSMatthew Knepley 49*bdad233fSMatthew Knepley .keywords: TS, create 50*bdad233fSMatthew Knepley .seealso: TSSetType(), TSSetUp(), TSDestroy(), MeshCreate() 51*bdad233fSMatthew Knepley @*/ 52*bdad233fSMatthew Knepley int TSCreate(MPI_Comm comm, TS *ts) { 53*bdad233fSMatthew Knepley TS t; 54*bdad233fSMatthew Knepley int ierr; 55*bdad233fSMatthew Knepley 56*bdad233fSMatthew Knepley PetscFunctionBegin; 57*bdad233fSMatthew Knepley PetscValidPointer(ts); 58*bdad233fSMatthew Knepley *ts = PETSC_NULL; 59*bdad233fSMatthew Knepley #ifndef PETSC_USE_DYNAMIC_LIBRARIES 60*bdad233fSMatthew Knepley ierr = TSInitializePackage(PETSC_NULL); CHKERRQ(ierr); 61*bdad233fSMatthew Knepley #endif 62*bdad233fSMatthew Knepley 63*bdad233fSMatthew Knepley PetscHeaderCreate(t, _TS, struct _TSOps, TS_COOKIE, -1, "TS", comm, TSDestroy, TSView); 64*bdad233fSMatthew Knepley PetscLogObjectCreate(t); 65*bdad233fSMatthew Knepley PetscLogObjectMemory(t, sizeof(struct _TS)); 66*bdad233fSMatthew Knepley ierr = PetscMemzero(t->ops, sizeof(struct _TSOps)); CHKERRQ(ierr); 67*bdad233fSMatthew Knepley t->bops->publish = TSPublish_Petsc; 68*bdad233fSMatthew Knepley t->type_name = PETSC_NULL; 69*bdad233fSMatthew Knepley t->serialize_name = PETSC_NULL; 70*bdad233fSMatthew Knepley 71*bdad233fSMatthew Knepley t->ops->applymatrixbc = TSDefaultSystemMatrixBC; 72*bdad233fSMatthew Knepley t->ops->applyrhsbc = TSDefaultRhsBC; 73*bdad233fSMatthew Knepley t->ops->applysolbc = TSDefaultSolutionBC; 74*bdad233fSMatthew Knepley t->ops->prestep = TSDefaultPreStep; 75*bdad233fSMatthew Knepley t->ops->update = TSDefaultUpdate; 76*bdad233fSMatthew Knepley t->ops->poststep = TSDefaultPostStep; 77*bdad233fSMatthew Knepley 78*bdad233fSMatthew Knepley /* General TS description */ 79*bdad233fSMatthew Knepley t->problem_type = TS_LINEAR; 80*bdad233fSMatthew Knepley t->vec_sol = PETSC_NULL; 81*bdad233fSMatthew Knepley t->vec_sol_always = PETSC_NULL; 82*bdad233fSMatthew Knepley t->numbermonitors = 0; 83*bdad233fSMatthew Knepley t->isGTS = PETSC_FALSE; 84*bdad233fSMatthew Knepley t->isExplicit = PETSC_NULL; 85*bdad233fSMatthew Knepley t->Iindex = PETSC_NULL; 86*bdad233fSMatthew Knepley t->sles = PETSC_NULL; 87*bdad233fSMatthew Knepley t->A = PETSC_NULL; 88*bdad233fSMatthew Knepley t->B = PETSC_NULL; 89*bdad233fSMatthew Knepley t->snes = PETSC_NULL; 90*bdad233fSMatthew Knepley t->funP = PETSC_NULL; 91*bdad233fSMatthew Knepley t->jacP = PETSC_NULL; 92*bdad233fSMatthew Knepley t->setupcalled = 0; 93*bdad233fSMatthew Knepley t->data = PETSC_NULL; 94*bdad233fSMatthew Knepley t->user = PETSC_NULL; 95*bdad233fSMatthew Knepley t->max_steps = 5000; 96*bdad233fSMatthew Knepley t->max_time = 5.0; 97*bdad233fSMatthew Knepley t->time_step = .1; 98*bdad233fSMatthew Knepley t->time_step_old = t->time_step; 99*bdad233fSMatthew Knepley t->initial_time_step = t->time_step; 100*bdad233fSMatthew Knepley t->steps = 0; 101*bdad233fSMatthew Knepley t->ptime = 0.0; 102*bdad233fSMatthew Knepley t->linear_its = 0; 103*bdad233fSMatthew Knepley t->nonlinear_its = 0; 104*bdad233fSMatthew Knepley t->work = PETSC_NULL; 105*bdad233fSMatthew Knepley t->nwork = 0; 106*bdad233fSMatthew Knepley 107*bdad233fSMatthew Knepley *ts = t; 108*bdad233fSMatthew Knepley PetscFunctionReturn(0); 109*bdad233fSMatthew Knepley } 110*bdad233fSMatthew Knepley 111*bdad233fSMatthew Knepley #undef __FUNCT__ 112*bdad233fSMatthew Knepley #define __FUNCT__ "TSSerialize" 113*bdad233fSMatthew Knepley /*@ 114*bdad233fSMatthew Knepley TSSerialize - This function stores or recreates a timestepper using a viewer for a binary file. 115*bdad233fSMatthew Knepley 116*bdad233fSMatthew Knepley Collective on MPI_Comm 117*bdad233fSMatthew Knepley 118*bdad233fSMatthew Knepley Input Parameters: 119*bdad233fSMatthew Knepley + comm - The communicator for the ts object 120*bdad233fSMatthew Knepley . viewer - The viewer context 121*bdad233fSMatthew Knepley - store - This flag is PETSC_TRUE is data is being written, otherwise it will be read 122*bdad233fSMatthew Knepley 123*bdad233fSMatthew Knepley Output Parameter: 124*bdad233fSMatthew Knepley . ts - The ts 125*bdad233fSMatthew Knepley 126*bdad233fSMatthew Knepley Level: beginner 127*bdad233fSMatthew Knepley 128*bdad233fSMatthew Knepley .keywords: TS, serialize 129*bdad233fSMatthew Knepley .seealso: PartitionSerialize(), TSSerialize() 130*bdad233fSMatthew Knepley @*/ 131*bdad233fSMatthew Knepley int TSSerialize(MPI_Comm comm, TS *ts, PetscViewer viewer, PetscTruth store) 132*bdad233fSMatthew Knepley { 133*bdad233fSMatthew Knepley int (*serialize)(MPI_Comm, TS *, PetscViewer, PetscTruth); 134*bdad233fSMatthew Knepley int fd, cookie, len; 135*bdad233fSMatthew Knepley char *name; 136*bdad233fSMatthew Knepley PetscTruth match; 137*bdad233fSMatthew Knepley int ierr; 138*bdad233fSMatthew Knepley 139*bdad233fSMatthew Knepley PetscFunctionBegin; 140*bdad233fSMatthew Knepley PetscValidHeaderSpecific(viewer, PETSC_VIEWER_COOKIE); 141*bdad233fSMatthew Knepley PetscValidPointer(ts); 142*bdad233fSMatthew Knepley 143*bdad233fSMatthew Knepley ierr = PetscTypeCompare((PetscObject) viewer, PETSC_VIEWER_BINARY, &match); CHKERRQ(ierr); 144*bdad233fSMatthew Knepley if (match == PETSC_FALSE) SETERRQ(PETSC_ERR_ARG_WRONG, "Must be binary viewer"); 145*bdad233fSMatthew Knepley ierr = PetscViewerBinaryGetDescriptor(viewer, &fd); CHKERRQ(ierr); 146*bdad233fSMatthew Knepley 147*bdad233fSMatthew Knepley if (!TSSerializeRegisterAllCalled) { 148*bdad233fSMatthew Knepley ierr = TSSerializeRegisterAll(PETSC_NULL); CHKERRQ(ierr); 149*bdad233fSMatthew Knepley } 150*bdad233fSMatthew Knepley if (!TSSerializeList) SETERRQ(PETSC_ERR_ARG_CORRUPT, "Could not find table of methods"); 151*bdad233fSMatthew Knepley 152*bdad233fSMatthew Knepley if (store) { 153*bdad233fSMatthew Knepley PetscValidHeaderSpecific(*ts, TS_COOKIE); 154*bdad233fSMatthew Knepley ierr = PetscBinaryWrite(fd, &(*ts)->cookie, 1, PETSC_INT, 0); CHKERRQ(ierr); 155*bdad233fSMatthew Knepley ierr = PetscStrlen((*ts)->serialize_name, &len); CHKERRQ(ierr); 156*bdad233fSMatthew Knepley ierr = PetscBinaryWrite(fd, &len, 1, PETSC_INT, 0); CHKERRQ(ierr); 157*bdad233fSMatthew Knepley ierr = PetscBinaryWrite(fd, (*ts)->serialize_name, len, PETSC_CHAR, 0); CHKERRQ(ierr); 158*bdad233fSMatthew Knepley ierr = PetscFListFind(comm, TSSerializeList, (*ts)->serialize_name, (void (**)(void)) &serialize); CHKERRQ(ierr); 159*bdad233fSMatthew Knepley if (!serialize) SETERRQ(PETSC_ERR_ARG_WRONG, "Type cannot be serialized"); 160*bdad233fSMatthew Knepley ierr = (*serialize)(comm, ts, viewer, store); CHKERRQ(ierr); 161*bdad233fSMatthew Knepley } else { 162*bdad233fSMatthew Knepley ierr = PetscBinaryRead(fd, &cookie, 1, PETSC_INT); CHKERRQ(ierr); 163*bdad233fSMatthew Knepley if (cookie != TS_COOKIE) SETERRQ(PETSC_ERR_ARG_WRONG, "Non-ts object"); 164*bdad233fSMatthew Knepley /* Dispatch to the correct routine */ 165*bdad233fSMatthew Knepley ierr = PetscBinaryRead(fd, &len, 1, PETSC_INT); CHKERRQ(ierr); 166*bdad233fSMatthew Knepley ierr = PetscMalloc((len+1) * sizeof(char), &name); CHKERRQ(ierr); 167*bdad233fSMatthew Knepley name[len] = 0; 168*bdad233fSMatthew Knepley ierr = PetscBinaryRead(fd, name, len, PETSC_CHAR); CHKERRQ(ierr); 169*bdad233fSMatthew Knepley ierr = PetscFListFind(comm, TSSerializeList, name, (void (**)(void)) &serialize); CHKERRQ(ierr); 170*bdad233fSMatthew Knepley if (!serialize) SETERRQ(PETSC_ERR_ARG_WRONG, "Type cannot be serialized"); 171*bdad233fSMatthew Knepley ierr = (*serialize)(comm, ts, viewer, store); CHKERRQ(ierr); 172*bdad233fSMatthew Knepley ierr = PetscStrfree((*ts)->serialize_name); CHKERRQ(ierr); 173*bdad233fSMatthew Knepley (*ts)->serialize_name = name; 174*bdad233fSMatthew Knepley } 175*bdad233fSMatthew Knepley 176*bdad233fSMatthew Knepley PetscFunctionReturn(0); 177*bdad233fSMatthew Knepley } 178