JEDI does not go inside the model structure but needs to be able to call the model one time step at a time.
type :: model contains procedure :: create ! Constructor procedure :: delete ! Destructor procedure :: initialize ! Initialize (before time loop) procedure :: step ! One time step (inside time loop) procedure :: finalize ! Clean-up (after time loop) procedure :: save_trajectory ! Compute trajectory for TL/AD procedure :: print ! Prints human readable info end type model subroutine create(self, geom, config) type(model), intent(inout) :: self end subroutine create subroutine delete(self) type(model), intent(inout) :: self end subroutine delete subroutine initialize(self, xx) type(model), intent(in) :: self type(state), intent(inout) :: xx end subroutine initialize subroutine step(self, xx) type(model), intent(in) :: self type(state), intent(inout) :: xx end subroutine step subroutine finalize(self, xx) type(model), intent(in) :: self type(state), intent(inout) :: xx end subroutine finalize subroutine save_trajectory(self, xx, traj) type(model), intent(in) :: self type(state), intent(inout) :: xx type(trajectory), intent(inout) :: traj end subroutine save_trajectory subroutine print(self) type(model), intent(in) :: self end subroutine print |
The TL/AD is similar:
type :: model contains procedure :: create ! Constructor procedure :: delete ! Destructor procedure :: set_trajectory ! Set trajectory for TL/AD procedure :: initialize_tl ! Initialize TL procedure :: step_tl ! One time step TL procedure :: finalize_tl ! Clean-up TL procedure :: initialize_ad ! Initialize AD procedure :: step_ad ! One time step AD procedure :: finalize_tad ! Clean-up AD procedure :: print ! Prints human readable info end type model subroutine create(self, geom, config) type(model), intent(inout) :: self end subroutine create subroutine delete(self) type(model), intent(inout) :: self end subroutine delete subroutine set_trajectory(self, xx, xlr) type(model), intent(inout) :: self type(state), intent(in) :: xx type(state), intent(inout) :: xlr end subroutine set_trajectory subroutine initialize_tl(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine initialize_tl subroutine step_tl(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine step_tl subroutine finalize_tl(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine finalize_tl subroutine initialize_ad(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine initialize_ad subroutine step_ad(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine step_ad subroutine finalize_ad(self, dx) type(model), intent(in) :: self type(increment), intent(inout) :: dx end subroutine finalize_ad subroutine print(self) type(model), intent(in) :: self end subroutine print |