From 5f2e2a6e28a7e030ca11e486a22a72a2590a59a7 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 12 Dec 2022 17:09:14 +0100
Subject: [PATCH] Philippe 12/12/2022: flyers: use arrays of pointers to flyers
 instead of arrays of flyers Useful to allow transfer of flyers between
 processses (to be developed)

---
 src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 |  4 +-
 src/MNH/aircraft_balloon.f90                |  4 +-
 src/MNH/ini_aircraft.f90                    | 36 +++++-----
 src/MNH/ini_aircraft_balloon.f90            |  8 +--
 src/MNH/ini_balloon.f90                     | 74 +++++++++++----------
 src/MNH/modd_aircraft_balloon.f90           | 13 +++-
 src/MNH/write_aircraft_balloon.f90          |  4 +-
 src/MNH/write_balloonn.f90                  |  2 +-
 8 files changed, 81 insertions(+), 64 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 54c01012f..b9c92d64b 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -1862,11 +1862,11 @@ if ( tpfile%lmaster ) then
 
     if ( lflyer ) then
       do ji = 1, nballoons
-        call Write_flyer_time_coord( tballoons(ji) )
+        call Write_flyer_time_coord( tballoons(ji)%tballoon )
       end do
 
       do ji = 1, naircrafts
-        call Write_flyer_time_coord( taircrafts(ji) )
+        call Write_flyer_time_coord( taircrafts(ji)%taircraft )
       end do
     end if
 
diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90
index a43f04c53..5028e0d9f 100644
--- a/src/MNH/aircraft_balloon.f90
+++ b/src/MNH/aircraft_balloon.f90
@@ -140,13 +140,13 @@ ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
 DO JI = 1, NBALLOONS
   CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TBALLOONS(JI), PSEA                                      )
+                              TBALLOONS(JI)%TBALLOON, PSEA                             )
 END DO
 !
 DO JI = 1, NAIRCRAFTS
   CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR,                        &
                               PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, &
-                              TAIRCRAFTS(JI), PSEA                                     )
+                              TAIRCRAFTS(JI)%TAIRCRAFT, PSEA                           )
 END DO
 !
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90
index d0f456f1a..b968be84d 100644
--- a/src/MNH/ini_aircraft.f90
+++ b/src/MNH/ini_aircraft.f90
@@ -113,12 +113,16 @@ USE MODN_AIRCRAFTS
 IMPLICIT NONE
 
 INTEGER :: JI
+TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT
 
 ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) )
 
 !Treat aircraft data read in namelist
 DO JI = 1, NAIRCRAFTS
-    TAIRCRAFTS(JI)%NID = JI
+    ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT )
+    TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT
+
+    TZAIRCRAFT%NID = JI
 
   IF ( CTITLE(JI) == '' ) THEN
     WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
@@ -127,7 +131,7 @@ DO JI = 1, NAIRCRAFTS
     CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT' )
   END IF
-  TAIRCRAFTS(JI)%CTITLE = CTITLE(JI)
+  TZAIRCRAFT%CTITLE = CTITLE(JI)
 
   IF ( CMODEL(JI) == 'FIX' ) THEN
     IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
@@ -150,15 +154,15 @@ DO JI = 1, NAIRCRAFTS
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
-  TAIRCRAFTS(JI)%CMODEL = CMODEL(JI)
-  TAIRCRAFTS(JI)%NMODEL = NMODEL(JI)
+  TZAIRCRAFT%CMODEL = CMODEL(JI)
+  TZAIRCRAFT%NMODEL = NMODEL(JI)
 
-  TAIRCRAFTS(JI)%CTYPE = CTYPE(JI)
+  TZAIRCRAFT%CTYPE = CTYPE(JI)
 
   IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) &
         CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', &
                         'problem with TLAUNCH (not set or incorrect values) for aircraft ' // TRIM( CTITLE(JI) ) )
-  TAIRCRAFTS(JI)%TLAUNCH  = TLAUNCH(JI)
+  TZAIRCRAFT%TLAUNCH  = TLAUNCH(JI)
 
   IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', &
@@ -168,31 +172,31 @@ DO JI = 1, NAIRCRAFTS
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'invalid data storage frequency for aircraft ' // TRIM( CTITLE(JI) ) )
     XTSTEP(JI) = 60.
   END IF
-  TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+  TZAIRCRAFT%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
   IF ( NPOS(JI) < 2 ) THEN
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) )
   END IF
-  TAIRCRAFTS(JI)%NPOS = NPOS(JI)
+  TZAIRCRAFT%NPOS = NPOS(JI)
 
-  TAIRCRAFTS(JI)%LALTDEF = LALTDEF(JI)
+  TZAIRCRAFT%LALTDEF = LALTDEF(JI)
 
   IF ( CFILE(JI) == '' ) &
     CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'name of CSV file with trajectory not provided for aircraft ' &
                     // TRIM( CTITLE(JI) ) )
 
   ! Allocate trajectory data
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSTIME(TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSTIME(:) = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSLAT (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLAT(:)  = XNEGUNDEF
-  ALLOCATE( TAIRCRAFTS(JI)%XPOSLON (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLON(:)  = XNEGUNDEF
-  IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN
-    ALLOCATE( TAIRCRAFTS(JI)%XPOSP (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSP(:)    = XNEGUNDEF
+  ALLOCATE( TZAIRCRAFT%XPOSTIME(TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSTIME(:) = XNEGUNDEF
+  ALLOCATE( TZAIRCRAFT%XPOSLAT (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLAT(:)  = XNEGUNDEF
+  ALLOCATE( TZAIRCRAFT%XPOSLON (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLON(:)  = XNEGUNDEF
+  IF ( TZAIRCRAFT%LALTDEF ) THEN
+    ALLOCATE( TZAIRCRAFT%XPOSP (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSP(:)    = XNEGUNDEF
   ELSE
-    ALLOCATE( TAIRCRAFTS(JI)%XPOSZ (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSZ(:)    = XNEGUNDEF
+    ALLOCATE( TZAIRCRAFT%XPOSZ (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSZ(:)    = XNEGUNDEF
   END IF
 
   ! Read CSV data (trajectory)
-  CALL AIRCRAFT_CSV_READ( TAIRCRAFTS(JI), CFILE(JI) )
+  CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) )
 
 END DO
 
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 59da978f8..2b9ef0f6c 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -138,7 +138,7 @@ ENDIF
 IF (IMI == 1) CALL INI_BALLOON
 !
 DO JI = 1, NBALLOONS
-  CALL INI_LAUNCH( JI, TBALLOONS(JI) )
+  CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON )
 END DO
 !
 !----------------------------------------------------------------------------
@@ -149,7 +149,7 @@ END DO
 IF (IMI == 1) CALL INI_AIRCRAFT
 !
 DO JI = 1, NAIRCRAFTS
-  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI) )
+  CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 !----------------------------------------------------------------------------
@@ -160,11 +160,11 @@ END DO
 IF (.NOT. LFLYER) RETURN
 !
 DO JI = 1, NBALLOONS
-  CALL ALLOCATE_FLYER( TBALLOONS(JI) )
+  CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON )
 END DO
 !
 DO JI = 1, NAIRCRAFTS
-  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI) )
+  CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 !----------------------------------------------------------------------------
diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90
index 3c3c4d6ae..7e268fb43 100644
--- a/src/MNH/ini_balloon.f90
+++ b/src/MNH/ini_balloon.f90
@@ -117,12 +117,16 @@ USE MODN_BALLOONS
 IMPLICIT NONE
 
 INTEGER :: JI
+TYPE(TBALLOONDATA), POINTER :: TZBALLOON
 
 ALLOCATE( TBALLOONS(NBALLOONS) )
 
 !Treat balloon data read in namelist
 DO JI = 1, NBALLOONS
-  TBALLOONS(JI)%NID = JI
+  ALLOCATE( TBALLOONS(JI)%TBALLOON )
+  TZBALLOON => TBALLOONS(JI)%TBALLOON
+
+  TZBALLOON%NID = JI
 
   IF ( CTITLE(JI) == '' ) THEN
     WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI
@@ -131,7 +135,7 @@ DO JI = 1, NBALLOONS
     CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) )
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON' )
   END IF
-  TBALLOONS(JI)%CTITLE = CTITLE(JI)
+  TZBALLOON%CTITLE = CTITLE(JI)
 
   IF ( CMODEL(JI) == 'FIX' ) THEN
     IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN
@@ -155,23 +159,23 @@ DO JI = 1, NBALLOONS
     CMODEL(JI) = 'FIX'
     NMODEL(JI) = 1
   END IF
-  TBALLOONS(JI)%CMODEL = CMODEL(JI)
-  TBALLOONS(JI)%NMODEL = NMODEL(JI)
+  TZBALLOON%CMODEL = CMODEL(JI)
+  TZBALLOON%NMODEL = NMODEL(JI)
 
-  TBALLOONS(JI)%CTYPE = CTYPE(JI)
+  TZBALLOON%CTYPE = CTYPE(JI)
 
   IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) &
         CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
                         'problem with TLAUNCH (not set or incorrect values) for balloon ' // TRIM( CTITLE(JI) ) )
-  TBALLOONS(JI)%TLAUNCH  = TLAUNCH(JI)
+  TZBALLOON%TLAUNCH  = TLAUNCH(JI)
 
   IF ( XLATLAUNCH(JI) == XUNDEF ) &
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
-  TBALLOONS(JI)%XLATLAUNCH = XLATLAUNCH(JI)
+  TZBALLOON%XLATLAUNCH = XLATLAUNCH(JI)
 
   IF ( XLONLAUNCH(JI) == XUNDEF ) &
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) )
-  TBALLOONS(JI)%XLONLAUNCH = XLONLAUNCH(JI)
+  TZBALLOON%XLONLAUNCH = XLONLAUNCH(JI)
 
   IF ( XTSTEP(JI) == XNEGUNDEF ) THEN
     CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
@@ -181,7 +185,7 @@ DO JI = 1, NBALLOONS
     CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'invalid data storage frequency for balloon ' // TRIM( CTITLE(JI) ) )
     XTSTEP(JI) = 60.
   END IF
-  TBALLOONS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI)
+  TZBALLOON%TFLYER_TIME%XTSTEP = XTSTEP(JI)
 
   SELECT CASE ( CTYPE(JI) )
     CASE ( 'CVBALL' )
@@ -193,15 +197,15 @@ DO JI = 1, NBALLOONS
       IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) &
         CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
                         'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
-      TBALLOONS(JI)%XPRES      = XPRES(JI)
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
+      TZBALLOON%XPRES      = XPRES(JI)
 
       IF ( XWASCENT(JI) == XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
                         'initial vertical speed not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.' )
         XWASCENT(JI) = 0.
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
 
       IF ( XAERODRAG(JI) == XNEGUNDEF ) THEN
@@ -209,29 +213,29 @@ DO JI = 1, NBALLOONS
                         'aerodynamic drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.44' )
         XAERODRAG(JI) = 0.44
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XINDDRAG(JI) == XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
                         'induced drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.014' )
         XINDDRAG(JI) = 0.014
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
 
       IF ( XMASS(JI) == XNEGUNDEF ) &
         CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'mass not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) )
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      TZBALLOON%XMASS = XMASS(JI)
 
       IF ( XDIAMETER(JI) <= 0. .AND. XVOLUME(JI) <= 0. ) &
         CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', &
                         'diameter or volume not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) )
 
       IF ( XDIAMETER(JI) <= 0. ) THEN
-        TBALLOONS(JI)%XVOLUME          = XVOLUME(JI)
-        TBALLOONS(JI)%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
+        TZBALLOON%XVOLUME          = XVOLUME(JI)
+        TZBALLOON%XDIAMETER        = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. )
       ELSE IF ( XVOLUME(JI) <= 0 ) THEN
-        TBALLOONS(JI)%XDIAMETER        = XDIAMETER(JI)
-        TBALLOONS(JI)%XVOLUME          = XPI / 6 * XDIAMETER(JI)**3
+        TZBALLOON%XDIAMETER        = XDIAMETER(JI)
+        TZBALLOON%XVOLUME          = XPI / 6 * XDIAMETER(JI)**3
       ELSE
         CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
                         'diameter or volume (not both) must be provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) )
@@ -245,15 +249,15 @@ DO JI = 1, NBALLOONS
       IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) &
         CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', &
                         'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
-      TBALLOONS(JI)%XPRES      = XPRES(JI)
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
+      TZBALLOON%XPRES      = XPRES(JI)
 
       IF ( XWASCENT(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'initial vertical speed is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XWASCENT(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
 
       IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
@@ -261,49 +265,49 @@ DO JI = 1, NBALLOONS
                         'aerodynamic drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XAERODRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'induced drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XINDDRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
 
       IF ( XMASS(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'mass is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XMASS(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      TZBALLOON%XMASS = XMASS(JI)
 
       IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'diameter is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XDIAMETER(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI)
+      TZBALLOON%XDIAMETER = XDIAMETER(JI)
 
       IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'volume is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XVOLUME(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XVOLUME = XVOLUME(JI)
+      TZBALLOON%XVOLUME = XVOLUME(JI)
 
 
     CASE ( 'RADIOS' )
       IF ( XALTLAUNCH(JI) == XNEGUNDEF ) &
         CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', &
                         'altitude of launch must be provided for radiosounding balloon ' // TRIM( CTITLE(JI) ) )
-      TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI)
+      TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI)
 
       IF ( XWASCENT(JI) == XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', &
                         'initial vertical speed not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 5.' )
         XWASCENT(JI) = 5.
       END IF
-      TBALLOONS(JI)%XWASCENT = XWASCENT(JI)
+      TZBALLOON%XWASCENT = XWASCENT(JI)
 
       IF ( XPRES(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                        &
@@ -311,7 +315,7 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XPRES(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                    &
@@ -319,7 +323,7 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XAERODRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI)
+      TZBALLOON%XAERODRAG = XAERODRAG(JI)
 
       IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON',                                &
@@ -327,28 +331,28 @@ DO JI = 1, NBALLOONS
                         // TRIM( CTITLE(JI) ) // ' => ignored' )
         XINDDRAG(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI)
+      TZBALLOON%XINDDRAG = XINDDRAG(JI)
 
       IF ( XMASS(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'mass is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XMASS(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XMASS = XMASS(JI)
+      TZBALLOON%XMASS = XMASS(JI)
 
       IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'diameter is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XDIAMETER(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI)
+      TZBALLOON%XDIAMETER = XDIAMETER(JI)
 
       IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN
         CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', &
                         'volume is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' )
         XVOLUME(JI) = XNEGUNDEF
       END IF
-      TBALLOONS(JI)%XVOLUME = XVOLUME(JI)
+      TZBALLOON%XVOLUME = XVOLUME(JI)
 
 
     CASE DEFAULT
diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90
index 167cf8fef..92d1ade55 100644
--- a/src/MNH/modd_aircraft_balloon.f90
+++ b/src/MNH/modd_aircraft_balloon.f90
@@ -178,8 +178,17 @@ END TYPE TBALLOONDATA
 INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts
 INTEGER :: NBALLOONS  = 0 ! Total number of balloons
 
-TYPE(TAIRCRAFTDATA), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts
+TYPE TAIRCRAFT_PTR
+  TYPE(TAIRCRAFTDATA), POINTER :: TAIRCRAFT => NULL()
+END TYPE TAIRCRAFT_PTR
+
+TYPE TBALLOON_PTR
+  TYPE(TBALLOONDATA), POINTER :: TBALLOON => NULL()
+END TYPE TBALLOON_PTR
+
+TYPE(TAIRCRAFT_PTR), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts
+
+TYPE(TBALLOON_PTR),  DIMENSION(:), ALLOCATABLE :: TBALLOONS  ! characteristics and records of the balloons
 
-TYPE(TBALLOONDATA),  DIMENSION(:), ALLOCATABLE :: TBALLOONS  ! characteristics and records of the balloons
 
 END MODULE MODD_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index d03d35acc..943c01bd3 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -98,11 +98,11 @@ INTEGER :: JI
 !----------------------------------------------------------------------------
 !
 DO JI = 1, NBALLOONS
-  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON )
 END DO
 
 DO JI = 1, NAIRCRAFTS
-  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT )
 END DO
 !
 END SUBROUTINE WRITE_AIRCRAFT_BALLOON
diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90
index 974bde880..2b1b55417 100644
--- a/src/MNH/write_balloonn.f90
+++ b/src/MNH/write_balloonn.f90
@@ -73,7 +73,7 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 INTEGER :: JI
 
 DO JI = 1, NBALLOONS
-  IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI) )
+  IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON )
 END DO
 
 END SUBROUTINE WRITE_BALLOON_n
-- 
GitLab