From fa27bdc0d3ab3f75b7563bbfe943987201ffaf82 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 22 Sep 2023 10:48:12 +0200
Subject: [PATCH] Philippe 22/09/2023: flyers: check that CCLOUD, CRAD and
 CTURB are the same on all nested models if some aircrafts/balloons may change
 of model (CMODEL='MOB')

---
 src/MNH/ini_aircraft_balloon.f90 | 52 ++++++++++++++++++++++++++++----
 1 file changed, 46 insertions(+), 6 deletions(-)

diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 7dc656703..f31a5584a 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -67,10 +67,11 @@ CONTAINS
 !          ------------
 !
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_CONF,       ONLY: CPROGRAM
+USE MODD_CONF,       ONLY: CPROGRAM, NMODEL
 USE MODD_DYN_n,      ONLY: DYN_MODEL
 USE MODD_IO,         ONLY: ISP, TFILEDATA
 USE MODD_PARAMETERS, ONLY: NUNDEF
+USE MODD_PARAM_n,    ONLY: PARAM_MODEL
 !
 USE MODE_GRIDPROJ,       ONLY: SM_XYHAT
 USE MODE_INI_AIRCRAFT,   ONLY: INI_AIRCRAFT
@@ -92,6 +93,7 @@ REAL,               INTENT(IN) :: PLONOR  ! longitude of origine point
 !
 INTEGER :: IMI    ! current model index
 INTEGER :: JI
+LOGICAL :: GCHECK
 !
 !----------------------------------------------------------------------------
 
@@ -99,12 +101,12 @@ IF ( CPROGRAM == 'DIAG  ') RETURN
 
 IF ( NAIRCRAFTS > 0 .OR. NBALLOONS > 0 ) LFLYER = .TRUE.
 
+IMI = GET_CURRENT_MODEL_INDEX()
+
 !----------------------------------------------------------------------------
 !
 !*      2.   Balloon initialization
 !            ----------------------
-IMI=GET_CURRENT_MODEL_INDEX()
-
 IF ( IMI == 1 ) THEN
   ALLOCATE( NRANKCUR_BALLOON (NBALLOONS) ); NRANKCUR_BALLOON = NFLYER_DEFAULT_RANK
   ALLOCATE( NRANKNXT_BALLOON (NBALLOONS) ); NRANKNXT_BALLOON = NFLYER_DEFAULT_RANK
@@ -147,13 +149,50 @@ END IF
 !*      4.   Allocations of storage arrays
 !            -----------------------------
 !
-IF ( IMI == 1 .AND. ISP == NFLYER_DEFAULT_RANK ) THEN
+! Check that CCLOUD, CRAD and CTURB are the same for all models if some flyers have CMODEL='MOB'
+! This is necessary because we need to allocate and compute the same data on every model if the flyer is allowed to change model
+! This check is only done once (on MODEL IMI=1)
+! This check has to be done AFTER the calls to INI_AIRCRAFT and INI_BALLOON
+IF ( IMI == 1 .AND. NMODEL > 1 .AND. ISP == NFLYER_DEFAULT_RANK ) THEN
+  GCHECK = .FALSE.
+
+  DO JI = 1, NBALLOONS
+    IF ( TBALLOONS(JI)%TBALLOON%CMODEL == 'MOB' ) THEN
+      GCHECK = .TRUE.
+      EXIT
+    END IF
+  END DO
+
+  DO JI = 1, NAIRCRAFTS
+    IF ( TAIRCRAFTS(JI)%TAIRCRAFT%CMODEL == 'MOB' ) THEN
+      GCHECK = .TRUE.
+      EXIT
+    END IF
+  END DO
+
+  IF ( GCHECK ) THEN
+    DO JI = 2, NMODEL
+      IF ( PARAM_MODEL(JI)%CCLOUD /= PARAM_MODEL(1)%CCLOUD )        &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT_BALLOON', &
+                       'CCLOUD must be the same on all nested domains if aircraft/balloon has CMODEL="MOB"' )
+      IF ( PARAM_MODEL(JI)%CRAD   /= PARAM_MODEL(1)%CRAD )          &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT_BALLOON', &
+                       'CRAD must be the same on all nested domains if aircraft/balloon has CMODEL="MOB"' )
+      IF ( PARAM_MODEL(JI)%CTURB  /= PARAM_MODEL(1)%CTURB )         &
+        CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT_BALLOON', &
+                       'CTURB must be the same on all nested domains if aircraft/balloon has CMODEL="MOB"' )
+    END DO
+  END IF
+END IF
+
+! Allocate data arrays of flyers
+IF ( ISP == NFLYER_DEFAULT_RANK ) THEN
   DO JI = 1, NBALLOONS
-    CALL TBALLOONS(JI)%TBALLOON%DATA_ARRAYS_ALLOCATE()
+    IF ( TBALLOONS(JI)%TBALLOON%NMODEL == IMI ) CALL TBALLOONS(JI)%TBALLOON%DATA_ARRAYS_ALLOCATE()
   END DO
 
   DO JI = 1, NAIRCRAFTS
-    CALL TAIRCRAFTS(JI)%TAIRCRAFT%DATA_ARRAYS_ALLOCATE()
+    IF ( TAIRCRAFTS(JI)%TAIRCRAFT%NMODEL == IMI ) CALL TAIRCRAFTS(JI)%TAIRCRAFT%DATA_ARRAYS_ALLOCATE()
   END DO
 END IF
 !
@@ -208,6 +247,7 @@ CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%X
 
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
   ! Read the current location in the synchronous file
+  ! Remark: if the balloon is not yet in flight or is crashed, position is not available in file
 
   IF ( TPINIFILE%CFORMAT == 'LFI'                                                             &
        .OR. ( TPINIFILE%CFORMAT == 'NETCDF4' .AND.                                            &
-- 
GitLab