xref: /petsc/src/ts/interface/tscreate.c (revision 94b7f48cc472a54ea2ce57edf1fe19e8a254237c)
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