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