--- trunk/Sources/phylmd/gr_fi_ecrit.f 2015/04/29 15:47:56 134 +++ trunk/phylmd/gr_phy_write.f 2018/03/20 09:35:59 265 @@ -1,32 +1,73 @@ -SUBROUTINE gr_fi_ecrit(nfield, nlon, iim, jjmp1, fi, ecrit) +module gr_phy_write_m - ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 + use dimensions, only: iim, jjm + use dimphy, only: klon IMPLICIT none - ! Transforme une variable de la grille physique à la grille d'écriture. - ! Cf. version moderne "gr_phy_write_2d", dans le cas où "nfield" vaut 1. + interface gr_phy_write + module procedure gr_phy_write_2d, gr_phy_write_3d + end interface gr_phy_write - INTEGER, intent(in):: nfield, nlon, iim, jjmp1 - REAL, intent(in):: fi(nlon, nfield) - real ecrit(iim*jjmp1, nfield) - - ! Variables local to the procedure: - - integer jjm - INTEGER i, n, ig - - !--------------- - - jjm = jjmp1 - 1 - DO n = 1, nfield - DO i=1, iim - ecrit(i, n) = fi(1, n) - ecrit(i+jjm*iim, n) = fi(nlon, n) - ENDDO - DO ig = 1, nlon - 2 - ecrit(iim+ig, n) = fi(1+ig, n) - ENDDO - ENDDO + private + public gr_phy_write -END SUBROUTINE gr_fi_ecrit +contains + + function gr_phy_write_2d(pfi) + + ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 + ! Transforme une variable de la grille physique \`a la grille d'\'ecriture. + ! The grid for output files does not duplicate the first longitude + ! in the last longitude. + + use grid_change, only: dyn_phy + + REAL, intent(in):: pfi(:) ! (klon) + real gr_phy_write_2d(iim, jjm + 1) + + ! Variable local to the procedure: + real field(iim, jjm + 1) + + !----------------------------------------------------------------------- + + if (size(pfi) /= klon) stop "gr_phy_write_2d" + + ! Traitement des p\^oles : + field(2:, 1) = pfi(1) + field(2:, jjm + 1) = pfi(klon) + + gr_phy_write_2d = unpack(pfi, dyn_phy(:iim, :), field) + + END function gr_phy_write_2d + + !******************************************** + + function gr_phy_write_3d(fi) + + ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28 + + ! Transforme une variable tri-dimensionnelle de la grille physique + ! \`a la grille d'\'ecriture. The grid for output files does not + ! duplicate the first longitude in the last longitude. Input array + ! has rank 2. Horizontal index is in the first dimension. + + use nr_util, only: assert + + REAL, intent(in):: fi(:, :) ! (klon, :) + real gr_phy_write_3d(iim, jjm + 1, size(fi, 2)) + + ! Local: + INTEGER l + + !--------------- + + call assert(size(fi, 1) == klon, "gr_phy_write_3d") + + DO l = 1, size(fi, 2) + gr_phy_write_3d(:, :, l) = gr_phy_write_2d(fi(:, l)) + END DO + + END function gr_phy_write_3d + +end module gr_phy_write_m