From de282b43767772c33a590d1375c4f915da488522 Mon Sep 17 00:00:00 2001 From: Juan Manuel Castillo Sanchez <48921434+ukmo-juan-castillo@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:21:40 +0000 Subject: [PATCH] Rewrite the cpl_oasis_grid subroutine for better performance and to use OASIS and SCRIP standards. (#1354) --- model/src/w3oacpmd.F90 | 64 ++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/model/src/w3oacpmd.F90 b/model/src/w3oacpmd.F90 index 72e48e4e1..f6a774593 100644 --- a/model/src/w3oacpmd.F90 +++ b/model/src/w3oacpmd.F90 @@ -162,13 +162,16 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) !/ | Last update : April-2016 | !/ +-----------------------------------+ !/ - !/ Jul-2013 : Origination. ( version 4.18 ) - !/ April-2016 : Add comments (J. Pianezze) ( version 5.07 ) - !/ Sept-2016 : Correct bug MPI (J. Pianezze) ( version 5.12 ) + !/ Jul-2013 : Origination. ( version 4.18 ) + !/ April-2016 : Add comments (J. Pianezze) ( version 5.07 ) + !/ Sept-2016 : Correct bug MPI (J. Pianezze) ( version 5.12 ) + !/ Jan-2025 : Use scrip format (J.M. Castillo) ( version x.xx ) !/ ! 1. Purpose : ! - ! Grid data file definition + ! Grid data file definition in the scrip format. + ! In this format, grid corners are specified in counterclockwise + ! order, being the first corner the one at the bottom left. ! ! 2. Method : ! 3. Parameters : @@ -250,41 +253,30 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) NYS=1 NYN=NY ! - ! lat/lon ALLOCATE ( LON(NNODES,1), LAT(NNODES,1) ) - I = 0 - DO IY = NYS, NYN - DO IX = NXW, NXE - I = I+1 - LON(I,1)=XGRD(IY,IX)*FACTOR - LAT(I,1)=YGRD(IY,IX)*FACTOR - END DO - END DO - ! - ! areas, corners ALLOCATE ( AREA(NNODES,1), CORLON(NNODES,1,4), CORLAT(NNODES,1,4) ) - I = 0 - DO IY = NYS, NYN - DO IX = NXW, NXE - I = I+1 - CORLON(I,1,1)=LON(I,1)+HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,2)=LON(I,1)-HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,3)=LON(I,1)-HPFAC(IY,IX)/2.*FACTOR - CORLON(I,1,4)=LON(I,1)+HPFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,1)=LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,2)=LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,3)=LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR - CORLAT(I,1,4)=LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR - AREA(I,1)=HPFAC(IY,IX)*HQFAC(IY,IX) - END DO - END DO - ! - ! Model grid mask ALLOCATE ( MASK(NNODES,1) ) + ! I = 0 DO IY = NYS, NYN DO IX = NXW, NXE I = I+1 + ! lat/lon + LON(I,1) = XGRD(IY,IX)*FACTOR + LAT(I,1) = YGRD(IY,IX)*FACTOR + ! + ! areas, corners + CORLON(I,1,1) = LON(I,1)-HPFAC(IY,IX)/2.*FACTOR + CORLON(I,1,2) = LON(I,1)+HPFAC(IY,IX)/2.*FACTOR + CORLON(I,1,3) = CORLON(I,1,2) + CORLON(I,1,4) = CORLON(I,1,1) + CORLAT(I,1,1) = LAT(I,1)-HQFAC(IY,IX)/2.*FACTOR + CORLAT(I,1,2) = CORLAT(I,1,1) + CORLAT(I,1,3) = LAT(I,1)+HQFAC(IY,IX)/2.*FACTOR + CORLAT(I,1,4) = CORLAT(I,1,3) + AREA(I,1) = HPFAC(IY,IX)*HQFAC(IY,IX) + ! + ! Model grid mask ! Get the mask : 0 - sea / 1 - open boundary cells (the land is already excluded) IF ((MAPSTA(IY,IX) .EQ. 1)) THEN MASK(I,1) = 0 @@ -317,13 +309,13 @@ SUBROUTINE CPL_OASIS_GRID(LD_MASTER,ID_LCOMM) CORLON(I,1,3) = CORLON(I,1,2) CORLON(I,1,4) = CORLON(I,1,1) CORLAT(I,1,1) = Y0 + IJKCel(2,I)*DLAT - CORLAT(I,1,2)=CORLAT(I,1,1) + CORLAT(I,1,2) = CORLAT(I,1,1) CORLAT(I,1,3) = Y0 + (IJKCel(2,I) + IJKCel(4,I))*DLAT - CORLAT(I,1,4)=CORLAT(I,1,3) + CORLAT(I,1,4) = CORLAT(I,1,3) ! areas AREA(I,1) = 0.25 * IJKCEL(3,I)*DLON * IJKCEL(4,I)*DLAT - ! Model grid mask - MASK(I,1) = 1 + ! Model grid mask: 0 - sea / 1 - open boundary cells (the land is already excluded) + MASK(I,1) = 0 ENDDO #endif !