Lines Matching refs:event

18 PetscErrorCode TSEventInitialize(TSEvent event, TS ts, PetscReal t, Vec U)  in TSEventInitialize()  argument
21 if (!event) PetscFunctionReturn(PETSC_SUCCESS); in TSEventInitialize()
22 PetscAssertPointer(event, 1); in TSEventInitialize()
25 event->ptime_prev = t; in TSEventInitialize()
26 event->iterctr = 0; in TSEventInitialize()
27 event->processing = PETSC_FALSE; in TSEventInitialize()
28 event->revisit_right = PETSC_FALSE; in TSEventInitialize()
29 PetscCallBack("TSEvent indicator", (*event->indicator)(ts, t, U, event->fvalue_prev, event->ctx)); in TSEventInitialize()
30 …TSEventCalcSigns(event->nevents, event->fvalue_prev, event->vtol, event->fsign_prev); // by this t… in TSEventInitialize()
34 PetscErrorCode TSEventDestroy(TSEvent *event) in TSEventDestroy() argument
37 PetscAssertPointer(event, 1); in TSEventDestroy()
38 if (!*event) PetscFunctionReturn(PETSC_SUCCESS); in TSEventDestroy()
39 if (--(*event)->refct > 0) { in TSEventDestroy()
40 *event = NULL; in TSEventDestroy()
44 PetscCall(PetscFree((*event)->fvalue_prev)); in TSEventDestroy()
45 PetscCall(PetscFree((*event)->fvalue)); in TSEventDestroy()
46 PetscCall(PetscFree((*event)->fvalue_right)); in TSEventDestroy()
47 PetscCall(PetscFree((*event)->fsign_prev)); in TSEventDestroy()
48 PetscCall(PetscFree((*event)->fsign)); in TSEventDestroy()
49 PetscCall(PetscFree((*event)->fsign_right)); in TSEventDestroy()
50 PetscCall(PetscFree((*event)->side)); in TSEventDestroy()
51 PetscCall(PetscFree((*event)->side_prev)); in TSEventDestroy()
52 PetscCall(PetscFree((*event)->justrefined_AB)); in TSEventDestroy()
53 PetscCall(PetscFree((*event)->gamma_AB)); in TSEventDestroy()
54 PetscCall(PetscFree((*event)->direction)); in TSEventDestroy()
55 PetscCall(PetscFree((*event)->terminate)); in TSEventDestroy()
56 PetscCall(PetscFree((*event)->events_zero)); in TSEventDestroy()
57 PetscCall(PetscFree((*event)->vtol)); in TSEventDestroy()
59 …for (PetscInt i = 0; i < (*event)->recsize; i++) PetscCall(PetscFree((*event)->recorder.eventidx[i… in TSEventDestroy()
60 PetscCall(PetscFree((*event)->recorder.eventidx)); in TSEventDestroy()
61 PetscCall(PetscFree((*event)->recorder.nevents)); in TSEventDestroy()
62 PetscCall(PetscFree((*event)->recorder.stepnum)); in TSEventDestroy()
63 PetscCall(PetscFree((*event)->recorder.time)); in TSEventDestroy()
65 PetscCall(PetscViewerDestroy(&(*event)->monitor)); in TSEventDestroy()
66 PetscCall(PetscFree(*event)); in TSEventDestroy()
140 ts->event->timestep_postevent = dt1; in TSSetPostEventStep()
204 ts->event->timestep_2nd_postevent = dt2; in TSSetPostEventSecondStep()
235 TSEvent event; in TSSetEventTolerances() local
240 …PetscCheck(ts->event, PetscObjectComm((PetscObject)ts), PETSC_ERR_USER, "Must set the events first… in TSSetEventTolerances()
242 event = ts->event; in TSSetEventTolerances()
244 for (PetscInt i = 0; i < event->nevents; i++) event->vtol[i] = vtol[i]; in TSSetEventTolerances()
247 for (PetscInt i = 0; i < event->nevents; i++) event->vtol[i] = tol; in TSSetEventTolerances()
313 TSEvent event; in TSSetEventHandler() local
327 PetscCall(PetscNew(&event)); in TSSetEventHandler()
328 PetscCall(PetscMalloc1(nevents, &event->fvalue_prev)); in TSSetEventHandler()
329 PetscCall(PetscMalloc1(nevents, &event->fvalue)); in TSSetEventHandler()
330 PetscCall(PetscMalloc1(nevents, &event->fvalue_right)); in TSSetEventHandler()
331 PetscCall(PetscMalloc1(nevents, &event->fsign_prev)); in TSSetEventHandler()
332 PetscCall(PetscMalloc1(nevents, &event->fsign)); in TSSetEventHandler()
333 PetscCall(PetscMalloc1(nevents, &event->fsign_right)); in TSSetEventHandler()
334 PetscCall(PetscMalloc1(nevents, &event->side)); in TSSetEventHandler()
335 PetscCall(PetscMalloc1(nevents, &event->side_prev)); in TSSetEventHandler()
336 PetscCall(PetscMalloc1(nevents, &event->justrefined_AB)); in TSSetEventHandler()
337 PetscCall(PetscMalloc1(nevents, &event->gamma_AB)); in TSSetEventHandler()
338 PetscCall(PetscMalloc1(nevents, &event->direction)); in TSSetEventHandler()
339 PetscCall(PetscMalloc1(nevents, &event->terminate)); in TSSetEventHandler()
340 PetscCall(PetscMalloc1(nevents, &event->events_zero)); in TSSetEventHandler()
341 PetscCall(PetscMalloc1(nevents, &event->vtol)); in TSSetEventHandler()
343 event->direction[i] = direction[i]; in TSSetEventHandler()
344 event->terminate[i] = terminate[i]; in TSSetEventHandler()
345 event->justrefined_AB[i] = PETSC_FALSE; in TSSetEventHandler()
346 event->gamma_AB[i] = 1; in TSSetEventHandler()
347 event->side[i] = 2; in TSSetEventHandler()
348 event->side_prev[i] = 0; in TSSetEventHandler()
350 event->iterctr = 0; in TSSetEventHandler()
351 event->processing = PETSC_FALSE; in TSSetEventHandler()
352 event->revisit_right = PETSC_FALSE; in TSSetEventHandler()
353 event->nevents = nevents; in TSSetEventHandler()
354 event->indicator = indicator; in TSSetEventHandler()
355 event->postevent = postevent; in TSSetEventHandler()
356 event->ctx = ctx; in TSSetEventHandler()
357 event->timestep_postevent = PETSC_DECIDE; in TSSetEventHandler()
358 event->timestep_2nd_postevent = PETSC_DECIDE; in TSSetEventHandler()
361 event->timestep_min = hmin; in TSSetEventHandler()
363 event->recsize = 8; /* Initial size of the recorder */ in TSSetEventHandler()
368 …nt_recorder_initial_size", "Initial size of event recorder", "", event->recsize, &event->recsize, … in TSSetEventHandler()
370 …_event_post_event_step", "First time step after event", "", event->timestep_postevent, &event->tim… in TSSetEventHandler()
371 …t_event_second_step", "Second time step after event", "", event->timestep_2nd_postevent, &event->t… in TSSetEventHandler()
372 …event_dt_min", "Minimum time step considered for TSEvent", "", event->timestep_min, &event->timest… in TSSetEventHandler()
376 PetscCall(PetscMalloc1(event->recsize, &event->recorder.time)); in TSSetEventHandler()
377 PetscCall(PetscMalloc1(event->recsize, &event->recorder.stepnum)); in TSSetEventHandler()
378 PetscCall(PetscMalloc1(event->recsize, &event->recorder.nevents)); in TSSetEventHandler()
379 PetscCall(PetscMalloc1(event->recsize, &event->recorder.eventidx)); in TSSetEventHandler()
380 …for (PetscInt i = 0; i < event->recsize; i++) PetscCall(PetscMalloc1(event->nevents, &event->recor… in TSSetEventHandler()
382 event->recorder.ctr = 0; in TSSetEventHandler()
384 for (PetscInt i = 0; i < event->nevents; i++) event->vtol[i] = tol; in TSSetEventHandler()
385 …if (flg) PetscCall(PetscViewerASCIIOpen(PetscObjectComm((PetscObject)ts), "stdout", &event->monito… in TSSetEventHandler()
387 PetscCall(TSEventDestroy(&ts->event)); in TSSetEventHandler()
388 ts->event = event; in TSSetEventHandler()
389 ts->event->refct = 1; in TSSetEventHandler()
397 static PetscErrorCode TSEventRecorderResize(TSEvent event) in TSEventRecorderResize() argument
406 PetscCall(PetscMalloc1(fact * event->recsize, &time)); in TSEventRecorderResize()
407 PetscCall(PetscMalloc1(fact * event->recsize, &stepnum)); in TSEventRecorderResize()
408 PetscCall(PetscMalloc1(fact * event->recsize, &nevents)); in TSEventRecorderResize()
409 PetscCall(PetscMalloc1(fact * event->recsize, &eventidx)); in TSEventRecorderResize()
410 …for (PetscInt i = 0; i < fact * event->recsize; i++) PetscCall(PetscMalloc1(event->nevents, &event… in TSEventRecorderResize()
413 PetscCall(PetscArraycpy(time, event->recorder.time, event->recsize)); in TSEventRecorderResize()
414 PetscCall(PetscArraycpy(stepnum, event->recorder.stepnum, event->recsize)); in TSEventRecorderResize()
415 PetscCall(PetscArraycpy(nevents, event->recorder.nevents, event->recsize)); in TSEventRecorderResize()
416 …for (PetscInt i = 0; i < event->recsize; i++) PetscCall(PetscArraycpy(eventidx[i], event->recorder… in TSEventRecorderResize()
419 for (PetscInt i = 0; i < event->recsize; i++) PetscCall(PetscFree(event->recorder.eventidx[i])); in TSEventRecorderResize()
420 PetscCall(PetscFree(event->recorder.eventidx)); in TSEventRecorderResize()
421 PetscCall(PetscFree(event->recorder.nevents)); in TSEventRecorderResize()
422 PetscCall(PetscFree(event->recorder.stepnum)); in TSEventRecorderResize()
423 PetscCall(PetscFree(event->recorder.time)); in TSEventRecorderResize()
426 event->recorder.time = time; in TSEventRecorderResize()
427 event->recorder.stepnum = stepnum; in TSEventRecorderResize()
428 event->recorder.nevents = nevents; in TSEventRecorderResize()
429 event->recorder.eventidx = eventidx; in TSEventRecorderResize()
432 event->recsize *= fact; in TSEventRecorderResize()
441 TSEvent event = ts->event; in TSPostEvent() local
450 if (event->postevent) { in TSPostEvent()
453 …Event post-event processing", (*event->postevent)(ts, event->nevents_zero, event->events_zero, t, … in TSPostEvent()
462 for (PetscInt i = 0; i < event->nevents_zero; i++) in TSPostEvent()
463 if (event->terminate[event->events_zero[i]]) terminate = PETSC_TRUE; in TSPostEvent()
483 …if (event->monitor) PetscCall(PetscPrintf(((PetscObject)ts)->comm, "TSEvent: at time %g the vector… in TSPostEvent()
485 PetscCallBack("TSEvent indicator", (*event->indicator)(ts, t, U, event->fvalue, event->ctx)); in TSPostEvent()
487 …TSEventCalcSigns(event->nevents, event->fvalue, event->vtol, event->fsign); // note, event->vtol m… in TSPostEvent()
492 ctr = event->recorder.ctr; in TSPostEvent()
493 if (ctr == event->recsize) PetscCall(TSEventRecorderResize(event)); in TSPostEvent()
494 event->recorder.time[ctr] = t; in TSPostEvent()
495 event->recorder.stepnum[ctr] = stepnum; in TSPostEvent()
496 event->recorder.nevents[ctr] = event->nevents_zero; in TSPostEvent()
497 …for (PetscInt i = 0; i < event->nevents_zero; i++) event->recorder.eventidx[ctr][i] = event->event… in TSPostEvent()
498 event->recorder.ctr++; in TSPostEvent()
573 TSEvent event = ts->event; in TSEventTestZero() local
576 for (PetscInt i = 0; i < event->nevents; i++) { in TSEventTestZero()
577 …const PetscBool bracket_is_left = (event->fsign_prev[i] * event->fsign[i] < 0 && event->fsign[i] *… in TSEventTestZero()
579 …if (bracket_is_left && ((t - event->ptime_prev <= event->timestep_min) || event->revisit_right)) e… in TSEventTestZero()
580 …if (event->fsign[i] == 0 && event->fsign_prev[i] != 0 && event->fsign_prev[i] * event->direction[i… in TSEventTestZero()
619 …mes->worktol == 0) ts->eval_times->worktol = ts->eval_times->reltol * ts->event->timestep_cache + … in TSEvent_dt_cap()
646 static inline void TSEvent_update_left(TSEvent event, PetscReal t) in TSEvent_update_left() argument
648 for (PetscInt i = 0; i < event->nevents; i++) { in TSEvent_update_left()
649 event->fvalue_prev[i] = event->fvalue[i]; in TSEvent_update_left()
650 event->fsign_prev[i] = event->fsign[i]; in TSEvent_update_left()
652 event->ptime_prev = t; in TSEvent_update_left()
658 static inline void TSEvent_update_right(TSEvent event, PetscReal t) in TSEvent_update_right() argument
660 for (PetscInt i = 0; i < event->nevents; i++) { in TSEvent_update_right()
661 event->fvalue_right[i] = event->fvalue[i]; in TSEvent_update_right()
662 event->fsign_right[i] = event->fsign[i]; in TSEvent_update_right()
664 event->ptime_right = t; in TSEvent_update_right()
670 static inline PetscReal TSEvent_update_from_right(TSEvent event) in TSEvent_update_from_right() argument
672 for (PetscInt i = 0; i < event->nevents; i++) { in TSEvent_update_from_right()
673 event->fvalue[i] = event->fvalue_right[i]; in TSEvent_update_from_right()
674 event->fsign[i] = event->fsign_right[i]; in TSEvent_update_from_right()
676 return event->ptime_right; in TSEvent_update_from_right()
776 TSEvent event; in TSEventHandler() local
786 if (!ts->event) PetscFunctionReturn(PETSC_SUCCESS); in TSEventHandler()
787 event = ts->event; in TSEventHandler()
788 event->nevents_zero = 0; in TSEventHandler()
789 revisit_right_cache = event->revisit_right; in TSEventHandler()
790 …for (PetscInt i = 0; i < event->nevents; i++) event->side[i] = 2; // side's are reset on each new … in TSEventHandler()
791 if (event->iterctr == 0) in TSEventHandler()
792 for (PetscInt i = 0; i < event->nevents; i++) event->justrefined_AB[i] = PETSC_FALSE; in TSEventHandler()
795 if (!event->processing) { // update the caches in TSEventHandler()
798 event->ptime_cache = t; in TSEventHandler()
799 event->timestep_cache = dt; // the next TS move is planned to be: t -> t+dt in TSEventHandler()
801 …if (event->processing && event->iterctr == 0 && Not_PETSC_DECIDE(event->timestep_2nd_postevent)) {… in TSEventHandler()
802 event->ptime_cache = t; in TSEventHandler()
803 event->timestep_cache = event->timestep_2nd_postevent; in TSEventHandler()
807 if (event->revisit_right) { in TSEventHandler()
808 PetscReal tr = TSEvent_update_from_right(event); in TSEventHandler()
812 …PetscCallBack("TSEvent indicator", (*event->indicator)(ts, t, U, event->fvalue, event->ctx)); // f… in TSEventHandler()
814 TSEventCalcSigns(event->nevents, event->fvalue, event->vtol, event->fsign); // fill fvalue signs in TSEventHandler()
818 for (PetscInt i = 0; i < event->nevents; i++) { // check for brackets on the left/right of 't' in TSEventHandler()
819 …if (event->side[i] != 0) event->side[i] = TSEventTestBracket(event->fsign_prev[i], event->fsign[i]… in TSEventHandler()
820 minsidein = PetscMin(minsidein, event->side[i]); in TSEventHandler()
830 …PetscCheck(!event->revisit_right || minsideout == 0, PetscObjectComm((PetscObject)ts), PETSC_ERR_P… in TSEventHandler()
833 …const PetscReal bracket_size = (minsideout == -1) ? t - event->ptime_prev : event->ptime_right - t… in TSEventHandler()
835 …if (minsideout == +1 && bracket_size <= event->timestep_min) { // check if the bracket (right) is … in TSEventHandler()
838 event->revisit_right = PETSC_TRUE; in TSEventHandler()
839 TSEvent_update_left(event, t); in TSEventHandler()
840 if (event->monitor) in TSEventHandler()
841event->monitor, "[%d] TSEvent: iter %" PetscInt_FMT " - reached too small bracket [%g - %g], next … in TSEventHandler()
842 … (double)event->ptime_right, (double)(event->ptime_prev + dt_next))); in TSEventHandler()
845 …if (bracket_size <= 2 * event->timestep_min) dt_next = bracket_size / 2; // the bracket is almost … in TSEventHandler()
848 for (PetscInt i = 0; i < event->nevents; i++) { in TSEventHandler()
849 if (event->side[i] == minsideout) { // only refine the appropriate brackets in TSEventHandler()
850event->ptime_prev, t, event->ptime_right, event->fvalue_prev[i], event->fvalue[i], event->fvalue_r… in TSEventHandler()
855 if (dt_next < event->timestep_min) dt_next = event->timestep_min; in TSEventHandler()
856 … if (bracket_size - dt_next < event->timestep_min) dt_next = bracket_size - event->timestep_min; in TSEventHandler()
860 TSEvent_update_right(event, t); in TSEventHandler()
863 …} else TSEvent_update_left(event, t); // minsideout == +1, update the lef… in TSEventHandler()
865 for (PetscInt i = 0; i < event->nevents; i++) { // update the "Anderson-Bjorck" flags in TSEventHandler()
866 if (event->side[i] == minsideout) { in TSEventHandler()
867 event->justrefined_AB[i] = PETSC_TRUE; // only for these i's Anderson-Bjorck was invoked in TSEventHandler()
868 if (event->monitor) in TSEventHandler()
869event->monitor, "[%d] TSEvent: iter %" PetscInt_FMT " - Event %" PetscInt_FMT " refining the brack… in TSEventHandler()
870 … (double)event->ptime_right, (double)(event->ptime_prev + dt_next))); in TSEventHandler()
871 … } else event->justrefined_AB[i] = PETSC_FALSE; // for these i's Anderson-Bjorck was not invoked in TSEventHandler()
874 event->iterctr++; in TSEventHandler()
875 event->processing = PETSC_TRUE; in TSEventHandler()
879 event->revisit_right = PETSC_FALSE; in TSEventHandler()
880 for (PetscInt i = 0; i < event->nevents; i++) in TSEventHandler()
881 if (event->side[i] == minsideout) { in TSEventHandler()
882 event->events_zero[event->nevents_zero++] = i; in TSEventHandler()
883 if (event->fsign[i] == 0) { // vtol was engaged in TSEventHandler()
884 if (event->monitor) in TSEventHandler()
885event->monitor, "[%d] TSEvent: iter %" PetscInt_FMT " - Event %" PetscInt_FMT " zero crossing loca… in TSEventHandler()
887 event->fsign[i] = 0; // sign = 0 is enforced further in TSEventHandler()
888 if (event->monitor) in TSEventHandler()
889event->monitor, "[%d] TSEvent: iter %" PetscInt_FMT " - Event %" PetscInt_FMT " accepting time %g … in TSEventHandler()
890 (double)event->ptime_prev, (double)t)); in TSEventHandler()
893 event->iterctr++; in TSEventHandler()
894 event->processing = PETSC_TRUE; in TSEventHandler()
897 …PetscCheck(event->iterctr == 0, PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Unexpected stat… in TSEventHandler()
898 if (event->processing) { in TSEventHandler()
900 …if (event->timestep_2nd_postevent == PETSC_DECIDE) dt2 = event->timestep_cache; … in TSEventHandler()
901 …else dt2 = event->timestep_2nd_postevent; … in TSEventHandler()
902 …PetscCall(TSSetTimeStep(ts, TSEvent_dt_cap(ts, t, dt2, Not_PETSC_DECIDE(event->timestep_2nd_postev… in TSEventHandler()
904 event->processing = PETSC_FALSE; in TSEventHandler()
914 if (event->timestep_postevent == PETSC_DECIDE) { // (1), (2) in TSEventHandler()
915 dt1 = event->ptime_cache - t; in TSEventHandler()
916 event->processing = PETSC_TRUE; in TSEventHandler()
918 dt1 = event->timestep_cache; in TSEventHandler()
919 event->processing = Not_PETSC_DECIDE(event->timestep_2nd_postevent); in TSEventHandler()
922 dt1 = event->timestep_postevent; // 1st post-event dt = user-provided value in TSEventHandler()
923 event->processing = Not_PETSC_DECIDE(event->timestep_2nd_postevent); in TSEventHandler()
926 …PetscCall(TSSetTimeStep(ts, TSEvent_dt_cap(ts, t, dt1, Not_PETSC_DECIDE(event->timestep_postevent)… in TSEventHandler()
927 event->iterctr = 0; in TSEventHandler()
930 …if (event->iterctr == 0) TSEvent_update_left(event, t); // not found an event, or finished the eve… in TSEventHandler()
940 TSEvent event; in TSAdjointEventHandler() local
948 if (!ts->event) PetscFunctionReturn(PETSC_SUCCESS); in TSAdjointEventHandler()
949 event = ts->event; in TSAdjointEventHandler()
954 ctr = event->recorder.ctr - 1; in TSAdjointEventHandler()
955 if (ctr >= 0 && PetscAbsReal(t - event->recorder.time[ctr]) < PETSC_SMALL) { in TSAdjointEventHandler()
957 if (event->postevent) { in TSAdjointEventHandler()
958 …-event processing", (*event->postevent)(ts, event->recorder.nevents[ctr], event->recorder.eventidx… in TSAdjointEventHandler()
959 event->recorder.ctr--; in TSAdjointEventHandler()
984 *nevents = ts->event->nevents; in TSGetNumEvents()