Commit 8ebffbb8 authored by Micael Oliveira's avatar Micael Oliveira

Merge branch 'system_of_systems' into 'develop'

Add new multisystem class

See merge request !881
parents 1976d611 d7a295c2
Pipeline #146078693 passed with stage
in 0 seconds
......@@ -509,6 +509,8 @@ system_f_srcs = \
system/subspace.F90 \
system/system.F90 \
system/system_abst.F90 \
system/system_factory.F90 \
system/system_factory_abst.F90 \
system/system_mxll.F90 \
system/v_ks.F90 \
system/xc_ks_inversion.F90 \
......
......@@ -111,7 +111,7 @@ contains
name = ""
if (associated(this%parent)) then
if (this%parent%len() > 0) then
name = trim(this%parent%get()) // delimiter_
name = trim(this%parent%get(delimiter_)) // delimiter_
end if
end if
name = trim(name)//this%name
......
This diff is collapsed.
This diff is collapsed.
......@@ -226,7 +226,7 @@ contains
description = "Unknown step for "
end select
PUSH_SUB(propagator_step_debug_message)
POP_SUB(propagator_step_debug_message)
end function propagator_step_debug_message
!--------------------------------------------------------
......
......@@ -67,6 +67,9 @@ module system_abst_oct_m
procedure :: update_interactions => system_update_interactions
procedure :: propagation_start => system_propagation_start
procedure :: propagation_finish => system_propagation_finish
procedure :: has_reached_final_propagation_time => system_has_reached_final_propagation_time
procedure :: propagation_step_finish => system_propagation_step_finish
procedure :: propagation_step_is_done => system_propagation_step_is_done
procedure(system_add_interaction_partner), deferred :: add_interaction_partner
procedure(system_has_interaction), deferred :: has_interaction
procedure(system_initial_conditions), deferred :: initial_conditions
......@@ -298,9 +301,9 @@ contains
end subroutine system_dt_operation
! ---------------------------------------------------------
subroutine system_init_clocks(this, dt, smallest_algo_dt)
subroutine system_init_clocks(this, smallest_algo_dt)
class(system_abst_t), intent(inout) :: this
FLOAT, intent(in) :: dt, smallest_algo_dt
FLOAT, intent(in) :: smallest_algo_dt
type(interaction_iterator_t) :: iter
class(interaction_abst_t), pointer :: interaction
......@@ -308,21 +311,21 @@ contains
PUSH_SUB(system_init_clocks)
! Internal clock
this%clock = clock_t(this%namespace%get(), dt, smallest_algo_dt)
this%clock = clock_t(this%namespace%get(), this%prop%dt, smallest_algo_dt)
! Propagator clock
this%prop%clock = clock_t(this%namespace%get(), dt/this%prop%algo_steps, smallest_algo_dt)
this%prop%clock = clock_t(this%namespace%get(), this%prop%dt/this%prop%algo_steps, smallest_algo_dt)
! Interaction clocks
call iter%start(this%interactions)
do while (iter%has_next())
interaction => iter%get_next_interaction()
call interaction%init_clock(this%namespace%get(), dt, smallest_algo_dt)
call interaction%init_clock(this%namespace%get(), this%prop%dt, smallest_algo_dt)
end do
! Required quantities clocks
where (this%quantities%required)
this%quantities%clock = clock_t(this%namespace%get(), dt, smallest_algo_dt)
this%quantities%clock = clock_t(this%namespace%get(), this%prop%dt, smallest_algo_dt)
end where
POP_SUB(system_init_clocks)
......@@ -471,8 +474,9 @@ contains
end function system_update_interactions
! ---------------------------------------------------------
subroutine system_init_propagator(this)
subroutine system_init_propagator(this, smallest_algo_dt)
class(system_abst_t), intent(inout) :: this
FLOAT, intent(inout) :: smallest_algo_dt
integer :: prop
......@@ -518,6 +522,10 @@ contains
call this%prop%rewind()
! Check if this propagators dt is smaller then the current smallest dt.
! If so, replace the current smallest dt by the one from this propagator.
smallest_algo_dt = min(smallest_algo_dt, this%prop%dt/this%prop%algo_steps)
POP_SUB(system_init_propagator)
end subroutine system_init_propagator
......@@ -563,7 +571,47 @@ contains
POP_SUB(system_propagation_finish)
end subroutine system_propagation_finish
! ---------------------------------------------------------
! ---------------------------------------------------------
logical function system_has_reached_final_propagation_time(this)
class(system_abst_t), intent(inout) :: this
PUSH_SUB(system_has_reached_final_propagation_time)
! Fixme: should be changed to final propagation time
system_has_reached_final_propagation_time = (this%clock%get_sim_time() > this%prop%max_td_steps*this%prop%dt)
POP_SUB(system_has_reached_final_propagation_time)
end function system_has_reached_final_propagation_time
! ---------------------------------------------------------
subroutine system_propagation_step_finish(this, iteration)
class(system_abst_t), intent(inout) :: this
integer, intent(in) :: iteration
PUSH_SUB(system_propagation_step_finish)
! Print information about the current iteration and write output
call this%output_write(iteration)
call this%iteration_info()
! Reset propagator for next step
call this%prop%rewind()
POP_SUB(system_propagation_step_finish)
end subroutine system_propagation_step_finish
! ---------------------------------------------------------
logical function system_propagation_step_is_done(this)
class(system_abst_t), intent(inout) :: this
PUSH_SUB(system_propagation_step_is_done)
system_propagation_step_is_done = this%prop%step_is_done()
POP_SUB(system_propagation_step_is_done)
end function system_propagation_step_is_done
! ---------------------------------------------------------
function system_iterator_get_next(this) result(value)
class(system_iterator_t), intent(inout) :: this
class(system_abst_t), pointer :: value
......
!! Copyright (C) 2020 M. Oliveira
!!
!! This program is free software; you can redistribute it and/or modify
!! it under the terms of the GNU General Public License as published by
!! the Free Software Foundation; either version 2, or (at your option)
!! any later version.
!!
!! This program is distributed in the hope that it will be useful,
!! but WITHOUT ANY WARRANTY; without even the implied warranty of
!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
!! GNU General Public License for more details.
!!
!! You should have received a copy of the GNU General Public License
!! along with this program; if not, write to the Free Software
!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
!! 02110-1301, USA.
!!
#include "global.h"
module system_factory_oct_m
use celestial_body_oct_m
use global_oct_m
use messages_oct_m
use multisystem_oct_m
use namespace_oct_m
use system_oct_m
use system_abst_oct_m
use system_factory_abst_oct_m
implicit none
private
public :: &
system_factory_t
integer, parameter :: &
SYSTEM_ELECTRONIC = 1, &
SYSTEM_MAXWELL = 2, &
SYSTEM_CELESTIAL_BODY = 3, &
SYSTEM_MULTISYSTEM = 4
type, extends(system_factory_abst_t) :: system_factory_t
contains
procedure :: create => system_factory_create
end type system_factory_t
contains
! ---------------------------------------------------------------------------------------
recursive function system_factory_create(this, namespace, name, type) result(system)
class(system_factory_t), intent(in) :: this
type(namespace_t), intent(in) :: namespace
character(len=*), intent(in) :: name
integer, intent(in) :: type
class(system_abst_t), pointer :: system
PUSH_SUB(system_factory_create)
select case (type)
case (SYSTEM_MULTISYSTEM)
system => multisystem_t(namespace_t(name, parent=namespace), this)
case (SYSTEM_CELESTIAL_BODY)
system => celestial_body_t(namespace_t(name, parent=namespace))
case default
system => null()
end select
POP_SUB(system_factory_create)
end function system_factory_create
end module system_factory_oct_m
!! Local Variables:
!! mode: f90
!! coding: utf-8
!! End:
!! Copyright (C) 2020 M. Oliveira
!!
!! This program is free software; you can redistribute it and/or modify
!! it under the terms of the GNU General Public License as published by
!! the Free Software Foundation; either version 2, or (at your option)
!! any later version.
!!
!! This program is distributed in the hope that it will be useful,
!! but WITHOUT ANY WARRANTY; without even the implied warranty of
!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
!! GNU General Public License for more details.
!!
!! You should have received a copy of the GNU General Public License
!! along with this program; if not, write to the Free Software
!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
!! 02110-1301, USA.
!!
module system_factory_abst_oct_m
use namespace_oct_m
use system_abst_oct_m
implicit none
private
public :: &
system_factory_abst_t
type, abstract :: system_factory_abst_t
contains
procedure(system_factory_abst_create), deferred :: create
end type system_factory_abst_t
abstract interface
function system_factory_abst_create(this, namespace, name, type) result(system)
import :: system_factory_abst_t
import system_abst_t
import namespace_t
class(system_factory_abst_t), intent(in) :: this
type(namespace_t), intent(in) :: namespace
character(len=*), intent(in) :: name
integer, intent(in) :: type
class(system_abst_t), pointer :: system
end function system_factory_abst_create
end interface
end module system_factory_abst_oct_m
!! Local Variables:
!! mode: f90
!! coding: utf-8
!! End:
......@@ -933,17 +933,13 @@ contains
! ---------------------------------------------------------
subroutine multisys_td_run(systems, fromScratch)
type(linked_list_t), intent(inout) :: systems
type(multisystem_t), intent(inout) :: systems
logical, intent(inout) :: fromScratch
integer :: it, internal_loop
logical :: any_td_step_done, all_done_max_td_steps
integer, parameter :: MAX_PROPAGATOR_STEPS = 1000
FLOAT :: smallest_algo_dt
type(system_iterator_t) :: iter
class(system_abst_t), pointer :: sys
PUSH_SUB(multisys_td_run)
call messages_write('Info: Running Multi-System time evolution')
......@@ -953,100 +949,41 @@ contains
! this should eventually be moved up to run.F90 when all systems
! are derived classes from system_abst
call multisystem_init_interactions(systems, global_namespace)
all_done_max_td_steps = .false.
it = 0
call systems%init_interactions()
! Initialize all propagators and find the smallest time-step
smallest_algo_dt = CNST(1e10)
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
! Initialize the propagator
call sys%init_propagator()
! Find the smallest dt
smallest_algo_dt = min(smallest_algo_dt, sys%prop%dt/sys%prop%algo_steps)
end do
call systems%init_propagator(smallest_algo_dt)
! Initialize all the clocks
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
call sys%init_clocks(sys%prop%dt, smallest_algo_dt)
end do
call systems%init_clocks(smallest_algo_dt)
! Set initial conditions
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
call sys%initial_conditions(.true.)
end do
call systems%initial_conditions(.true.)
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
call sys%propagation_start()
end do
call systems%propagation_start()
! The full TD loop
call messages_print_stress(stdout, "Multi-system propagation", namespace=global_namespace)
call messages_print_stress(stdout, "Multi-system propagation", namespace=systems%namespace)
all_done_max_td_steps = .false.
it = 0
do while(.not. all_done_max_td_steps)
do while (.not. systems%has_reached_final_propagation_time())
it = it + 1
any_td_step_done = .false.
internal_loop = 1
do while(.not. any_td_step_done .and. internal_loop < MAX_PROPAGATOR_STEPS)
any_td_step_done = .false.
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
call sys%dt_operation()
! We check the exit condition
any_td_step_done = any_td_step_done .or. sys%prop%step_is_done()
end do
INCR(internal_loop, 1)
end do
all_done_max_td_steps = .true.
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
! Print information about the current iteration and write output
if(sys%prop%step_is_done()) then
call sys%prop%rewind()
call sys%output_write(it)
call sys%iteration_info()
end if
! Fixme: should be changed to final propagation time
all_done_max_td_steps = all_done_max_td_steps .and. (sys%clock%get_sim_time() > sys%prop%max_td_steps*sys%prop%dt)
do while (.not. systems%propagation_step_is_done() .and. internal_loop < MAX_PROPAGATOR_STEPS)
call systems%dt_operation()
internal_loop = internal_loop + 1
end do
write (message(1), '(a)') repeat ('-', 71)
call messages_info(1)
call systems%propagation_step_finish(it)
write (message(1), '(a)') repeat ('-', 71)
call messages_info(1)
end do
call iter%start(systems)
do while (iter%has_next())
sys => iter%get_next_system()
call sys%propagation_finish()
end do
call systems%propagation_finish()
POP_SUB(multisys_td_run)
end subroutine multisys_td_run
......
CalculationMode = td
ExperimentalFeatures = yes
Dimensions = 3
%Systems
"SolarSystem" | multisystem
%
%SolarSystem.Systems
"Sun" | celestial_body
"Earth" | celestial_body
"Moon" | celestial_body
%
#Initial conditions are taken from https://ssd.jpl.nasa.gov/horizons.cgi#top.
# initial condition at time:
# 2458938.500000000 = A.D. 2020-Mar-30 00:00:00.0000 TDB
SolarSystem.Earth.CelestialBodyMass = 5.97237e24
%SolarSystem.Earth.CelestialBodyInitialPosition
-147364661998.16476 | -24608859261.610123 | 1665165.2801353487
%
%SolarSystem.Earth.CelestialBodyInitialVelocity
4431.136612956525 | -29497.611635546345 | 0.343475566161544
%
SolarSystem.Earth.TDSystemPropagator = verlet
SolarSystem.Moon.CelestialBodyMass = 7.342e22
%SolarSystem.Moon.CelestialBodyInitialPosition
-147236396732.81906 | -24234200672.857853 | -11062799.286082389
%
%SolarSystem.Moon.CelestialBodyInitialVelocity
3484.6397238565924 | -29221.007409082802 | 82.53526338876684
%
SolarSystem.Moon.TDSystemPropagator = verlet
SolarSystem.Sun.CelestialBodyMass = 1.98855e30
%SolarSystem.Sun.CelestialBodyInitialPosition
0.0 | 0.0 | 0.0
%
%SolarSystem.Sun.CelestialBodyInitialVelocity
0.0 | 0.0 | 0.0
%
SolarSystem.Sun.TDSystemPropagator = verlet
sampling = 24 # Time-steps per day
days = 3
TDTimeStep = 24*3600/sampling
TDMaxSteps = days*sampling
CalculationMode = td
ExperimentalFeatures = yes
Dimensions = 3
%Systems
"SolarSystem" | multisystem
%
%SolarSystem.Systems
"Sun" | celestial_body
"Earth" | multisystem
%
%SolarSystem.Earth.Systems
"Terra" | celestial_body
"Luna" | celestial_body
%
#Initial conditions are taken from https://ssd.jpl.nasa.gov/horizons.cgi#top.
# initial condition at time:
# 2458938.500000000 = A.D. 2020-Mar-30 00:00:00.0000 TDB
SolarSystem.Earth.Terra.CelestialBodyMass = 5.97237e24
%SolarSystem.Earth.Terra.CelestialBodyInitialPosition
-147364661998.16476 | -24608859261.610123 | 1665165.2801353487
%
%SolarSystem.Earth.Terra.CelestialBodyInitialVelocity
4431.136612956525 | -29497.611635546345 | 0.343475566161544
%
SolarSystem.Earth.Terra.TDSystemPropagator = verlet
SolarSystem.Earth.Luna.CelestialBodyMass = 7.342e22
%SolarSystem.Earth.Luna.CelestialBodyInitialPosition
-147236396732.81906 | -24234200672.857853 | -11062799.286082389
%
%SolarSystem.Earth.Luna.CelestialBodyInitialVelocity
3484.6397238565924 | -29221.007409082802 | 82.53526338876684
%
SolarSystem.Earth.Luna.TDSystemPropagator = verlet
SolarSystem.Sun.CelestialBodyMass = 1.98855e30
%SolarSystem.Sun.CelestialBodyInitialPosition
0.0 | 0.0 | 0.0
%
%SolarSystem.Sun.CelestialBodyInitialVelocity
0.0 | 0.0 | 0.0
%
SolarSystem.Sun.TDSystemPropagator = verlet
sampling = 24 # Time-steps per day
days = 3
TDTimeStep = 24*3600/sampling
TDMaxSteps = days*sampling
CalculationMode = td
ExperimentalFeatures = yes
Dimensions = 3
%Systems
"MilkyWay" | multisystem
%
%MilkyWay.Systems
"SolarSystem" | multisystem
%
%MilkyWay.SolarSystem.Systems
"Sun" | celestial_body
"Earth" | multisystem
%
%MilkyWay.SolarSystem.Earth.Systems
"Terra" | celestial_body
"Luna" | celestial_body
%
#Initial conditions are taken from https://ssd.jpl.nasa.gov/horizons.cgi#top.
# initial condition at time:
# 2458938.500000000 = A.D. 2020-Mar-30 00:00:00.0000 TDB
MilkyWay.SolarSystem.Earth.Terra.CelestialBodyMass = 5.97237e24
%MilkyWay.SolarSystem.Earth.Terra.CelestialBodyInitialPosition
-147364661998.16476 | -24608859261.610123 | 1665165.2801353487
%
%MilkyWay.SolarSystem.Earth.Terra.CelestialBodyInitialVelocity
4431.136612956525 | -29497.611635546345 | 0.343475566161544
%
MilkyWay.SolarSystem.Earth.Terra.TDSystemPropagator = verlet
MilkyWay.SolarSystem.Earth.Luna.CelestialBodyMass = 7.342e22
%MilkyWay.SolarSystem.Earth.Luna.CelestialBodyInitialPosition
-147236396732.81906 | -24234200672.857853 | -11062799.286082389
%
%MilkyWay.SolarSystem.Earth.Luna.CelestialBodyInitialVelocity
3484.6397238565924 | -29221.007409082802 | 82.53526338876684
%
MilkyWay.SolarSystem.Earth.Luna.TDSystemPropagator = verlet
MilkyWay.SolarSystem.Sun.CelestialBodyMass = 1.98855e30
%MilkyWay.SolarSystem.Sun.CelestialBodyInitialPosition
0.0 | 0.0 | 0.0
%
%MilkyWay.SolarSystem.Sun.CelestialBodyInitialVelocity
0.0 | 0.0 | 0.0
%
MilkyWay.SolarSystem.Sun.TDSystemPropagator = verlet
sampling = 24 # Time-steps per day
days = 3
TDTimeStep = 24*3600/sampling
TDMaxSteps = days*sampling
# -*- coding: utf-8 mode: shell-script -*-
Test : Solar system as system of systems
Program : octopus
TestGroups : short-run, multisystem
Enabled : Yes
Processors: 1
Input: 01-nested_systems.01-two_levels.inp
match ; Sun pos x (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 3) ; -6.134351620199e+02
match ; Sun pos y (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 4) ; -1.134689251424e+02
match ; Sun pos z (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 5) ; 6.794152425957e-03
match ; Sun vel x (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 6) ; -4.659195414154e-03
match ; Sun vel y (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 7) ; -9.039865460789e-04
match ; Sun vel z (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 8) ; 5.353995554838e-08
match ; Earth pos x (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 3) ; -1.459982809400e+11
match ; Earth pos y (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 4) ; -3.232242026952e+10
match ; Earth pos z (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 5) ; 1.738815874319e+06
match ; Earth vel x (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 6) ; 5.963512670321e+03
match ; Earth vel y (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 7) ; -2.919187562247e+04
match ; Earth vel z (t=3 days) ; LINEFIELD(SolarSystem/Earth/td.general/coordinates, -1, 8) ; 3.004350138872e-01
match ; Moon pos x (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 3) ; -1.461278487102e+11
match ; Moon pos y (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 4) ; -3.196480317618e+10
match ; Moon pos z (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 5) ; 1.179498535710e+07
match ; Moon vel x (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 6) ; 5.025449409110e+03
match ; Moon vel y (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 7) ; -2.960708948803e+04
match ; Moon vel z (t=3 days) ; LINEFIELD(SolarSystem/Moon/td.general/coordinates, -1, 8) ; 8.458630158791e+01
Input: 01-nested_systems.02-three_levels.inp
# The values for the following matches are the same as above, as the way how the systems are divided into subsystems is equivalent
match ; Sun pos x (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 3) ; -6.134351620199e+02
match ; Sun pos y (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 4) ; -1.134689251424e+02
match ; Sun pos z (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 5) ; 6.794152425957e-03
match ; Sun vel x (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 6) ; -4.659195414154e-03
match ; Sun vel y (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 7) ; -9.039865460789e-04
match ; Sun vel z (t=3 days) ; LINEFIELD(SolarSystem/Sun/td.general/coordinates, -1, 8) ; 5.353995554838e-08
match ; Earth pos x (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 3) ; -1.459982809400e+11
match ; Earth pos y (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 4) ; -3.232242026952e+10
match ; Earth pos z (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 5) ; 1.738815874319e+06
match ; Earth vel x (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 6) ; 5.963512670321e+03
match ; Earth vel y (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 7) ; -2.919187562247e+04
match ; Earth vel z (t=3 days) ; LINEFIELD(SolarSystem/Earth/Terra/td.general/coordinates, -1, 8) ; 3.004350138872e-01
match ; Moon pos x (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 3) ; -1.461278487102e+11
match ; Moon pos y (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 4) ; -3.196480317618e+10
match ; Moon pos z (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 5) ; 1.179498535710e+07
match ; Moon vel x (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 6) ; 5.025449409110e+03
match ; Moon vel y (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 7) ; -2.960708948803e+04
match ; Moon vel z (t=3 days) ; LINEFIELD(SolarSystem/Earth/Luna/td.general/coordinates, -1, 8) ; 8.458630158791e+01
Input: 01-nested_systems.03-four_levels.inp
# The values for the following matches are the same as above, as the way how the systems are divided into subsystems is equivalent
match ; Sun pos x (t=3 days) ; LINEFIELD(MilkyWay/SolarSystem/Sun/td.general/coordinates, -1, 3) ; -6.134351620199e+02
match ; Sun pos y (t=3 days) ; LINEFIELD(MilkyWay/SolarSystem/Sun/td.general/coordinates, -1, 4) ; -1.134689251424e+02
match ; Sun pos z (t=3 days) ; LINEFIELD(MilkyWay/SolarSystem/Sun/td.general/coordinates, -1, 5) ; 6.794152425957e-03