diff --git a/src/OCE/OBS/diaobs.F90 b/src/OCE/OBS/diaobs.F90
index 1e831ab8a14936d743163c261ef4fbb39ba5e07b..7ee22c3a41560f7b6cd74aca0cf94d40b6229369 100644
--- a/src/OCE/OBS/diaobs.F90
+++ b/src/OCE/OBS/diaobs.F90
@@ -426,6 +426,9 @@ CONTAINS
       ENDIF
       !
       IF( ln_grid_global ) THEN
+         IF( jpnij < jpni * jpnj ) THEN
+            CALL ctl_stop( 'STOP', 'dia_obs_init: ln_grid_global=T is not available when land subdomains are suppressed' )
+         END IF
          CALL ctl_warn( 'dia_obs_init: ln_grid_global=T may cause memory issues when used with a large number of processors' )
       ENDIF
       !
diff --git a/src/OCE/OBS/obs_grd_bruteforce.h90 b/src/OCE/OBS/obs_grd_bruteforce.h90
index 7340e336164d62bd1065633e9a44ff4236bb22cb..a9af765595ff583c54f169147bec228af1d0015d 100644
--- a/src/OCE/OBS/obs_grd_bruteforce.h90
+++ b/src/OCE/OBS/obs_grd_bruteforce.h90
@@ -1,5 +1,4 @@
 SUBROUTINE obs_grd_bruteforce( kpi, kpj, kpiglo, kpjglo,       &
-      &                            kldi, klei, kldj, klej,         &
       &                            kmyproc, ktotproc,              &
       &                            pglam, pgphi, pmask,            &
       &                            kobs, plam, pphi, kobsi, kobsj, &
@@ -27,10 +26,6 @@ SUBROUTINE obs_grd_bruteforce( kpi, kpj, kpiglo, kpjglo,       &
       INTEGER, INTENT(IN) :: kpj                ! Number of local latitudes
       INTEGER, INTENT(IN) :: kpiglo             ! Number of global longitudes
       INTEGER, INTENT(IN) :: kpjglo             ! Number of global latitudes
-      INTEGER, INTENT(IN) :: kldi               ! Start of inner domain in i
-      INTEGER, INTENT(IN) :: klei               ! End of inner domain in i
-      INTEGER, INTENT(IN) :: kldj               ! Start of inner domain in j
-      INTEGER, INTENT(IN) :: klej               ! End of inner domain in j
       INTEGER, INTENT(IN) :: kmyproc            ! Processor number for MPP
       INTEGER, INTENT(IN) :: ktotproc           ! Total number of processors
       REAL(KIND=wp), DIMENSION(kpi,kpj), INTENT(IN) :: &
@@ -109,16 +104,24 @@ SUBROUTINE obs_grd_bruteforce( kpi, kpj, kpiglo, kpjglo,       &
          zlamg(:,:) = -1.e+10
          zphig(:,:) = -1.e+10
          zmskg(:,:) = -1.e+10
-         DO jj = kldj, klej
-            DO ji = kldi, klei
-               zlamg(mig(ji),mjg(jj)) = pglam(ji,jj)
-               zphig(mig(ji),mjg(jj)) = pgphi(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = pmask(ji,jj)
-            END DO
-         END DO
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            zlamg(mig(ji),mjg(jj)) = pglam(ji,jj)
+            zphig(mig(ji),mjg(jj)) = pgphi(ji,jj)
+            zmskg(mig(ji),mjg(jj)) = pmask(ji,jj)
+         END_2D
+         DO_2D( 0, 0, 0, 0 )
+            zlamg(mig(ji),mjg(jj)) = pglam(ji,jj) + 1000000.0_wp
+            zphig(mig(ji),mjg(jj)) = pgphi(ji,jj) + 1000000.0_wp
+            zmskg(mig(ji),mjg(jj)) = pmask(ji,jj) + 1000000.0_wp
+         END_2D
          CALL mpp_global_max( zlamg )
          CALL mpp_global_max( zphig )
          CALL mpp_global_max( zmskg )
+         WHERE( zmskg(:,:) >= 1000000.0_wp )
+            zlamg(:,:) = zlamg(:,:) - 1000000.0_wp
+            zphig(:,:) = zphig(:,:) - 1000000.0_wp
+            zmskg(:,:) = zmskg(:,:) - 1000000.0_wp
+         END WHERE
       ELSE
          DO jj = 1, jlat
             DO ji = 1, jlon
diff --git a/src/OCE/OBS/obs_grid.F90 b/src/OCE/OBS/obs_grid.F90
index 428ab5e3ab6b6a62861a3d181c1aed31167b7574..d22ee7dd6dc93f2bf71a7458342a6dcf065ea4d3 100644
--- a/src/OCE/OBS/obs_grid.F90
+++ b/src/OCE/OBS/obs_grid.F90
@@ -84,6 +84,8 @@ MODULE obs_grid
    CHARACTER(LEN=44), PUBLIC :: &
       & cn_gridsearchfile    ! file name head for grid search lookup 
 
+   !! * Substitutions
+#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: obs_grid.F90 14275 2021-01-07 12:13:16Z smasson $
@@ -128,28 +130,24 @@ CONTAINS
          ELSE
             IF ( cdgrid == 'T' ) THEN
                CALL obs_grd_bruteforce( jpi, jpj, jpiglo, jpjglo, &
-                  &                             1, jpi, 1, jpj,           &
                   &                             narea-1, jpnij,           &
                   &                             glamt, gphit, tmask,      &
                   &                             kobsin, plam, pphi,       &
                   &                             kobsi, kobsj, kproc )
             ELSEIF ( cdgrid == 'U' ) THEN
                CALL obs_grd_bruteforce( jpi, jpj, jpiglo, jpjglo, &
-                  &                             1, jpi, 1, jpj,           &
                   &                             narea-1, jpnij,           &
                   &                             glamu, gphiu, umask,      &
                   &                             kobsin, plam, pphi,       &
                   &                             kobsi, kobsj, kproc )
             ELSEIF ( cdgrid == 'V' ) THEN
                CALL obs_grd_bruteforce( jpi, jpj, jpiglo, jpjglo, &
-                  &                             1, jpi, 1, jpj,           &
                   &                             narea-1, jpnij,           &
                   &                             glamv, gphiv, vmask,      &
                   &                             kobsin, plam, pphi,       &
                   &                             kobsi, kobsj, kproc )
             ELSEIF ( cdgrid == 'F' ) THEN
                CALL obs_grd_bruteforce( jpi, jpj, jpiglo, jpjglo, &
-                  &                             1, jpi, 1, jpj,           &
                   &                             narea-1, jpnij,           &
                   &                             glamf, gphif, fmask,      &
                   &                             kobsin, plam, pphi,       &
@@ -278,16 +276,24 @@ CONTAINS
          zphig(:,:) = -1.e+10
          zmskg(:,:) = -1.e+10
          ! Add various grids here.
-         DO jj = 1, jpj
-            DO ji = 1, jpi
-               zlamg(mig(ji),mjg(jj)) = glamt(ji,jj)
-               zphig(mig(ji),mjg(jj)) = gphit(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = tmask(ji,jj,1)
-            END DO
-         END DO
+         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
+            zlamg(mig(ji),mjg(jj)) = glamt(ji,jj)
+            zphig(mig(ji),mjg(jj)) = gphit(ji,jj)
+            zmskg(mig(ji),mjg(jj)) = tmask(ji,jj,1)
+         END_2D
+         DO_2D( 0, 0, 0, 0 )
+            zlamg(mig(ji),mjg(jj)) = glamt(ji,jj)   + 1000000.0_wp
+            zphig(mig(ji),mjg(jj)) = gphit(ji,jj)   + 1000000.0_wp
+            zmskg(mig(ji),mjg(jj)) = tmask(ji,jj,1) + 1000000.0_wp
+         END_2D
          CALL mpp_global_max( zlamg )
          CALL mpp_global_max( zphig )
          CALL mpp_global_max( zmskg )
+         WHERE( zmskg(:,:) >= 1000000.0_wp )
+            zlamg(:,:) = zlamg(:,:) - 1000000.0_wp
+            zphig(:,:) = zphig(:,:) - 1000000.0_wp
+            zmskg(:,:) = zmskg(:,:) - 1000000.0_wp
+         END WHERE
       ELSE
          ! Add various grids here.
          DO jj = 1, jlat
@@ -818,7 +824,6 @@ CONTAINS
             END DO
             
             CALL obs_grd_bruteforce( jpi, jpj, jpiglo, jpjglo,  &
-               &                     1, jpi, 1, jpj,            &
                &                     narea-1, jpnij,            &
                &                     glamt, gphit, tmask,       &
                &                     nlons*nlats, lonsi, latsi, &