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" 3660893bc3SSatish Balay /*@C 37bd6a702fSBarry Smith TSCreate - This function creates an empty timestepper. The problem type can then be set with TSSetProblemType() and the 38bd6a702fSBarry 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 51bd6a702fSBarry 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; 87*94b7f48cSBarry Smith t->ksp = 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