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