Maff's changes to speed-up MEDUSA

NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

Replacing

      INTEGER,  DIMENSION(:,:,:), POINTER     ::   data_jpi     ! array of source integers
      INTEGER,  DIMENSION(:,:,:), POINTER     ::   data_jpj     ! array of source integers
      REAL(wp), DIMENSION(:,:,:), POINTER     ::   data_wgt     ! array of weights on model grid
      REAL(wp), DIMENSION(:,:,:), POINTER     ::   fly_dta      ! array of values on input grid
      REAL(wp), DIMENSION(:,:,:), POINTER     ::   col          ! temporary array for reading in columns

with

      INTEGER,  DIMENSION(:,:,:), ALLOCATABLE ::   data_jpi     ! array of source integers
      INTEGER,  DIMENSION(:,:,:), ALLOCATABLE ::   data_jpj     ! array of source integers
      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   data_wgt     ! array of weights on model grid
      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   fly_dta      ! array of values on input grid
      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   col          ! temporary array for reading in columns

Replacing

      REAL(wp), POINTER, DIMENSION(:,:) ::   utmp, vtmp   ! temporary arrays for vector rotation
      CHARACTER (LEN=100)               ::   clcomp       ! dummy weight name
      !!---------------------------------------------------------------------

      CALL wrk_alloc( jpi,jpj, utmp, vtmp )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   utmp, vtmp   ! temporary arrays for vector rotation
      CHARACTER (LEN=100)               ::   clcomp       ! dummy weight name
      !!---------------------------------------------------------------------

      ALLOCATE( utmp (1:jpi, 1:jpj) )
      ALLOCATE( vtmp (1:jpi, 1:jpj) )

Replacing

      CALL wrk_dealloc( jpi,jpj, utmp, vtmp )

with

      DEALLOCATE (utmp, vtmp)

Replacing

         IF( ASSOCIATED(ref_wgts(kw)%data_wgt) )  WRITE(numout,*) '       allocated'

with

         IF( ALLOCATED(ref_wgts(kw)%data_wgt) )  WRITE(numout,*) '       allocated'

Replacing

      INTEGER , POINTER, DIMENSION(:,:) ::   data_src
      REAL(wp), POINTER, DIMENSION(:,:) ::   data_tmp
      LOGICAL                           ::   cyclical
      INTEGER                           ::   zwrap      ! local integer
      !!----------------------------------------------------------------------
      !
      CALL wrk_alloc( jpi,jpj, data_src )   ! integer
      CALL wrk_alloc( jpi,jpj, data_tmp )

with

      INTEGER , ALLOCATABLE, DIMENSION(:,:) ::   data_src
      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   data_tmp
      LOGICAL                           ::   cyclical
      INTEGER                           ::   zwrap      ! local integer
      !!----------------------------------------------------------------------
      !
      ALLOCATE(data_src(1:jpi, 1:jpj))
      ALLOCATE(data_tmp(1:jpi, 1:jpj))

Replacing

      CALL wrk_dealloc( jpi,jpj, data_src )   ! integer
      CALL wrk_dealloc( jpi,jpj, data_tmp )

with

      DEALLOCATE( data_src )   ! integer
      DEALLOCATE( data_tmp )

NEMOGCM/NEMO/OPA_SRC/SOL/solpcg.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:) ::   zgcr
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('sol_pcg')
      !
      CALL wrk_alloc( jpi, jpj, zgcr )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zgcr
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('sol_pcg')
      !
      ALLOCATE( zgcr(jpi,jpj) )

Replacing

      CALL wrk_dealloc( jpi, jpj, zgcr )

with

      DEALLOCATE ( zgcr )

NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:,:) :: zun, zvn, zwn

      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_adv')
      !
      CALL wrk_alloc( jpi, jpj, jpk, zun, zvn, zwn )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zun, zvn, zwn

      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_adv')
      !

      ALLOCATE( zun(1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zvn(1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zwn(1:jpi, 1:jpj, 1:jpk) )

Replacing

      IF( nn_timing == 1 )  CALL timing_stop( 'tra_adv' )
      !
      CALL wrk_dealloc( jpi, jpj, jpk, zun, zvn, zwn )

with

      DEALLOCATE ( zun, zvn, zwn )
      IF( nn_timing == 1 )  CALL timing_stop( 'tra_adv' )

NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zslpx, zslpy   ! 3D workspace
      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zwx  , zwy     ! -      - 

      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_adv_muscl')
      !
      CALL wrk_alloc( jpi, jpj, jpk, zslpx, zslpy, zwx, zwy )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zslpx, zslpy   ! 3D workspace
      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwx  , zwy     ! -      - 

      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_adv_muscl')
      !
      ALLOCATE( zslpx(1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zslpy(1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zwx  (1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zwy  (1:jpi, 1:jpj, 1:jpk) )

Replacing

      CALL wrk_dealloc( jpi, jpj, jpk, zslpx, zslpy, zwx, zwy )

with

      DEALLOCATE( zslpx )
      DEALLOCATE( zslpy )
      DEALLOCATE( zwx   )
      DEALLOCATE( zwy   )

NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdt, ztrds
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start( 'tra_bbl')
      !
      IF( l_trdtra )   THEN                         !* Save ta and sa trends
         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdt, ztrds
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start( 'tra_bbl')
      !
      IF( l_trdtra )   THEN                         !* Save ta and sa trends
         ALLOCATE( ztrdt (1:jpi, 1:jpj, 1:jpk))
         ALLOCATE( ztrds (1:jpi, 1:jpj, 1:jpk))

Replacing

         CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )

with

         DEALLOCATE( ztrdt, ztrds )

Replacing

      REAL(wp), POINTER, DIMENSION(:,:) :: zptb
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_bbl_dif')
      !
      CALL wrk_alloc( jpi, jpj, zptb )

with

      REAL(wp), ALLOCATABLE , DIMENSION(:,:) :: zptb
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_bbl_dif')
      !
      ALLOCATE(zptb(1:jpi, 1:jpj))

Replacing

      CALL wrk_dealloc( jpi, jpj, zptb )

with

      DEALLOCATE( zptb )

NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:  ) ::  z2d
      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zdkt, zdk1t, zdit, zdjt, ztfw 
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_ldf_iso')
      !
      CALL wrk_alloc( jpi, jpj,      z2d ) 
      CALL wrk_alloc( jpi, jpj, jpk, zdit, zdjt, ztfw, zdkt, zdk1t )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) ::  z2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  zdkt, zdk1t, zdit, zdjt, ztfw 
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('tra_ldf_iso')
      !
      ALLOCATE( z2d   (1:jpi, 1:jpj) )
      ALLOCATE( zdit  (1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zdjt  (1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( ztfw  (1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zdkt  (1:jpi, 1:jpj, 1:jpk) )
      ALLOCATE( zdk1t (1:jpi, 1:jpj, 1:jpk) )

Replacing

      CALL wrk_dealloc( jpi, jpj, z2d ) 
      CALL wrk_dealloc( jpi, jpj, jpk, zdit, zdjt, ztfw, zdkt, zdk1t ) 

with

      DEALLOCATE( z2d    )
      DEALLOCATE( zdit   )
      DEALLOCATE( zdjt   )
      DEALLOCATE( ztfw   )
      DEALLOCATE( zdkt   )
      DEALLOCATE( zdk1t  )

NEMOGCM/NEMO/TOP_SRC/MEDUSA/trcbio_medusa.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:  ) :: fprn2d, fdpn2d, fprd2d, fdpd2d, fprds2d, fsdiss2d, fgmipn2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: fgmid2d, fdzmi2d, fgmepn2d, fgmepd2d, fgmezmi2d, fgmed2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: fdzme2d, fslown2d, fdd2d, ffetop2d, ffebot2d, ffescav2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: fjln2d, fnln2d, ffln2d, fjld2d, fnld2d, ffld2d, fsld2d2
      REAL(wp), POINTER, DIMENSION(:,:  ) :: fsld2d, fregen2d, fregensi2d, ftempn2d, ftempsi2d, ftempfe2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: ftempc2d, ftempca2d, freminn2d, freminsi2d, freminfe2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: freminc2d, freminca2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: zw2d
# if defined key_roam
      REAL(wp), POINTER, DIMENSION(:,:  ) :: ffastca2d, rivn2d, rivsi2d, rivc2d, rivalk2d, fslowc2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: fdpn22d, fdpd22d, fdzmi22d, fdzme22d, zimesn2d, zimesd2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: zimesc2d, zimesdc2d, ziexcr2d, ziresp2d, zigrow2d, zemesn2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: zemesd2d, zemesc2d, zemesdc2d, zeexcr2d, zeresp2d, zegrow2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: mdetc2d, gmidc2d, gmedc2d, f_pco2a2d, f_pco2w2d, f_co2flux2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: f_TDIC2d, f_TALK2d, f_kw6602d, f_pp02d, f_o2flux2d, f_o2sat2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: dms_surf2d, dms_andr2d, dms_simo2d, dms_aran2d, dms_hall2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: iben_n2d, iben_fe2d, iben_c2d, iben_si2d, iben_ca2d, oben_n2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: oben_fe2d, oben_c2d, oben_si2d, oben_ca2d, sfr_ocal2d
      REAL(wp), POINTER, DIMENSION(:,:  ) :: sfr_oarg2d, lyso_ca2d 
# endif
      !! 2D var for diagnostics.
      REAL(wp), POINTER, DIMENSION(:,:,:) :: tpp3d, detflux3d, remin3dn

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fprn2d, fdpn2d, fprd2d, fdpd2d, fprds2d, fsdiss2d, fgmipn2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fgmid2d, fdzmi2d, fgmepn2d, fgmepd2d, fgmezmi2d, fgmed2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fdzme2d, fslown2d, fdd2d, ffetop2d, ffebot2d, ffescav2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fjln2d, fnln2d, ffln2d, fjld2d, fnld2d, ffld2d, fsld2d2
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fsld2d, fregen2d, fregensi2d, ftempn2d, ftempsi2d, ftempfe2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: ftempc2d, ftempca2d, freminn2d, freminsi2d, freminfe2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: freminc2d, freminca2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zw2d
# if defined key_roam
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: ffastca2d, rivn2d, rivsi2d, rivc2d, rivalk2d, fslowc2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: fdpn22d, fdpd22d, fdzmi22d, fdzme22d, zimesn2d, zimesd2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zimesc2d, zimesdc2d, ziexcr2d, ziresp2d, zigrow2d, zemesn2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: zemesd2d, zemesc2d, zemesdc2d, zeexcr2d, zeresp2d, zegrow2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: mdetc2d, gmidc2d, gmedc2d, f_pco2a2d, f_pco2w2d, f_co2flux2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: f_TDIC2d, f_TALK2d, f_kw6602d, f_pp02d, f_o2flux2d, f_o2sat2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: dms_surf2d, dms_andr2d, dms_simo2d, dms_aran2d, dms_hall2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: iben_n2d, iben_fe2d, iben_c2d, iben_si2d, iben_ca2d, oben_n2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: oben_fe2d, oben_c2d, oben_si2d, oben_ca2d, sfr_ocal2d
      REAL(wp), ALLOCATABLE, DIMENSION(:,:  ) :: sfr_oarg2d, lyso_ca2d 
# endif
      !! 2D var for diagnostics.
      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: tpp3d, detflux3d, remin3dn

Replacing code of the form

      CALL wrk_alloc( jpi, jpj, <pointer>)

with code of the form

      ALLOCATE(<array>(jpi, jpj))

Replacing code of the form

                         CALL wrk_dealloc( jpi, jpj,      <pointer>)

with code of the form

                         DEALLOCATE(    <array>  )

NEMOGCM/NEMO/TOP_SRC/TRP/trcbbl.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   ztrtrd
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('trc_bbl')
      !
      IF( .NOT. lk_offline .AND. nn_dttrc == 1 ) THEN
         CALL bbl( kt, nittrc000, 'TRC' )      ! Online coupling with dynamics  : Computation of bbl coef and bbl transport
         l_bbl = .FALSE.                       ! Offline coupling with dynamics : Read bbl coef and bbl transport from input files
      ENDIF

      IF( l_trdtrc )  THEN
         CALL wrk_alloc( jpi, jpj, jpk, jptra, ztrtrd ) ! temporary save of trends

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrtrd
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )  CALL timing_start('trc_bbl')
      !
      IF( .NOT. lk_offline .AND. nn_dttrc == 1 ) THEN
         CALL bbl( kt, nittrc000, 'TRC' )      ! Online coupling with dynamics  : Computation of bbl coef and bbl transport
         l_bbl = .FALSE.                       ! Offline coupling with dynamics : Read bbl coef and bbl transport from input files
      ENDIF

      IF( l_trdtrc )  THEN
         ALLOCATE( ztrtrd (1:jpi, 1:jpj, 1:jpk, 1:jptra) )

Replacing

        CALL wrk_dealloc( jpi, jpj, jpk, jptra, ztrtrd ) ! temporary save of trends

with

        DEALLOCATE(  ztrtrd ) ! temporary save of trends

NEMOGCM/NEMO/TOP_SRC/TRP/trcldf.F90

Replacing

      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   ztrtrd
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )   CALL timing_start('trc_ldf')
      !
      IF( kt == nittrc000 )   CALL ldf_ctl          ! initialisation & control of options

      rldf = rldf_rat

      IF( l_trdtrc )  THEN
         CALL wrk_alloc( jpi, jpj, jpk, jptra, ztrtrd )

with

      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrtrd
      !!----------------------------------------------------------------------
      !
      IF( nn_timing == 1 )   CALL timing_start('trc_ldf')
      !
      IF( kt == nittrc000 )   CALL ldf_ctl          ! initialisation & control of options

      rldf = rldf_rat

      IF( l_trdtrc )  THEN
         ALLOCATE( ztrtrd(1:jpi, 1:jpj, 1:jpk, 1:jptra))

Replacing

        CALL wrk_dealloc( jpi, jpj, jpk, jptra, ztrtrd )

with

        DEALLOCATE( ztrtrd )

NEMOGCM/NEMO/OPA_SRC/lib_fortran.F90

Maff has a lib_fortran.F90-bak, so looks like he's tried a change to this file which probably caused the problem I experience with my job stalling.