New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
p4zbio.F90 in NEMO/branches/2019/dev_r11943_MERGE_2019/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11943_MERGE_2019/src/TOP/PISCES/P4Z/p4zbio.F90 @ 12340

Last change on this file since 12340 was 12340, checked in by acc, 4 years ago

Branch 2019/dev_r11943_MERGE_2019. This commit introduces basic do loop macro
substitution to the 2019 option 1, merge branch. These changes have been SETTE
tested. The only addition is the do_loop_substitute.h90 file in the OCE directory but
the macros defined therein are used throughout the code to replace identifiable, 2D-
and 3D- nested loop opening and closing statements with single-line alternatives. Code
indents are also adjusted accordingly.

The following explanation is taken from comments in the new header file:

This header file contains preprocessor definitions and macros used in the do-loop
substitutions introduced between version 4.0 and 4.2. The primary aim of these macros
is to assist in future applications of tiling to improve performance. This is expected
to be achieved by alternative versions of these macros in selected locations. The
initial introduction of these macros simply replaces all identifiable nested 2D- and
3D-loops with single line statements (and adjusts indenting accordingly). Do loops
are identifiable if they comform to either:

DO jk = ....

DO jj = .... DO jj = ...

DO ji = .... DO ji = ...
. OR .
. .

END DO END DO

END DO END DO

END DO

and white-space variants thereof.

Additionally, only loops with recognised jj and ji loops limits are treated; these are:
Lower limits of 1, 2 or fs_2
Upper limits of jpi, jpim1 or fs_jpim1 (for ji) or jpj, jpjm1 or fs_jpjm1 (for jj)

The macro naming convention takes the form: DO_2D_BT_LR where:

B is the Bottom offset from the PE's inner domain;
T is the Top offset from the PE's inner domain;
L is the Left offset from the PE's inner domain;
R is the Right offset from the PE's inner domain

So, given an inner domain of 2,jpim1 and 2,jpjm1, a typical example would replace:

DO jj = 2, jpj

DO ji = 1, jpim1
.
.

END DO

END DO

with:

DO_2D_01_10
.
.
END_2D

similar conventions apply to the 3D loops macros. jk loop limits are retained
through macro arguments and are not restricted. This includes the possibility of
strides for which an extra set of DO_3DS macros are defined.

In the example definition below the inner PE domain is defined by start indices of
(kIs, kJs) and end indices of (kIe, KJe)

#define DO_2D_00_00 DO jj = kJs, kJe ; DO ji = kIs, kIe
#define END_2D END DO ; END DO

TO DO:


Only conventional nested loops have been identified and replaced by this step. There are constructs such as:

DO jk = 2, jpkm1

z2d(:,:) = z2d(:,:) + e3w(:,:,jk,Kmm) * z3d(:,:,jk) * wmask(:,:,jk)

END DO

which may need to be considered.

  • Property svn:keywords set to Id
File size: 5.8 KB
Line 
1MODULE p4zbio
2   !!======================================================================
3   !!                         ***  MODULE p4zbio  ***
4   !! TOP :   PISCES bio-model
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!----------------------------------------------------------------------
9   !!   p4z_bio        :   computes the interactions between the different
10   !!                      compartments of PISCES
11   !!----------------------------------------------------------------------
12   USE oce_trc         !  shared variables between ocean and passive tracers
13   USE trc             !  passive tracers common variables
14   USE sms_pisces      !  PISCES Source Minus Sink variables
15   USE p4zsink         !  vertical flux of particulate matter due to sinking
16   USE p4zopt          !  optical model
17   USE p4zlim          !  Co-limitations of differents nutrients
18   USE p4zprod         !  Growth rate of the 2 phyto groups
19   USE p4zmort         !  Mortality terms for phytoplankton
20   USE p4zmicro        !  Sources and sinks of microzooplankton
21   USE p4zmeso         !  Sources and sinks of mesozooplankton
22   USE p5zlim          !  Co-limitations of differents nutrients
23   USE p5zprod         !  Growth rate of the 2 phyto groups
24   USE p5zmort         !  Mortality terms for phytoplankton
25   USE p5zmicro        !  Sources and sinks of microzooplankton
26   USE p5zmeso         !  Sources and sinks of mesozooplankton
27   USE p4zrem          !  Remineralisation of organic matter
28   USE p4zpoc          !  Remineralization of organic particles
29   USE p4zagg          !  Aggregation of particles
30   USE p4zfechem
31   USE p4zligand       !  Prognostic ligand model
32   USE prtctl_trc      !  print control for debugging
33   USE iom             !  I/O manager
34 
35   IMPLICIT NONE
36   PRIVATE
37
38   PUBLIC  p4z_bio   
39
40   !! * Substitutions
41#  include "do_loop_substitute.h90"
42   !!----------------------------------------------------------------------
43   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
44   !! $Id$
45   !! Software governed by the CeCILL license (see ./LICENSE)
46   !!----------------------------------------------------------------------
47CONTAINS
48
49   SUBROUTINE p4z_bio ( kt, knt, Kbb, Kmm, Krhs )
50      !!---------------------------------------------------------------------
51      !!                     ***  ROUTINE p4z_bio  ***
52      !!
53      !! ** Purpose :   Ecosystem model in the whole ocean: computes the
54      !!              different interactions between the different compartments
55      !!              of PISCES
56      !!
57      !! ** Method  : - ???
58      !!---------------------------------------------------------------------
59      INTEGER, INTENT(in) :: kt, knt
60      INTEGER, INTENT(in) :: Kbb, Kmm, Krhs  ! time level indices
61      !
62      INTEGER             :: ji, jj, jk, jn
63      CHARACTER (len=25) :: charout
64      !!---------------------------------------------------------------------
65      !
66      IF( ln_timing )   CALL timing_start('p4z_bio')
67      !
68      !     ASSIGN THE SHEAR RATE THAT IS USED FOR AGGREGATION
69      !     OF PHYTOPLANKTON AND DETRITUS
70
71      xdiss(:,:,:) = 1.
72!!gm the use of nmld should be better here?
73      DO_3D_11_11( 2, jpkm1 )
74!!gm  :  use nmln  and test on jk ...  less memory acces
75         IF( gdepw(ji,jj,jk+1,Kmm) > hmld(ji,jj) )   xdiss(ji,jj,jk) = 0.01
76      END_3D
77
78      CALL p4z_opt     ( kt, knt, Kbb, Kmm       )     ! Optic: PAR in the water column
79      CALL p4z_sink    ( kt, knt, Kbb, Kmm, Krhs )     ! vertical flux of particulate organic matter
80      CALL p4z_fechem  ( kt, knt, Kbb, Kmm, Krhs )     ! Iron chemistry/scavenging
81      !
82      IF( ln_p4z ) THEN
83         CALL p4z_lim  ( kt, knt, Kbb, Kmm       )     ! co-limitations by the various nutrients
84         CALL p4z_prod ( kt, knt, Kbb, Kmm, Krhs )     ! phytoplankton growth rate over the global ocean.
85         !                                          ! (for each element : C, Si, Fe, Chl )
86         CALL p4z_mort ( kt,      Kbb,      Krhs )     ! phytoplankton mortality
87         !                                          ! zooplankton sources/sinks routines
88         CALL p4z_micro( kt, knt, Kbb,      Krhs )     ! microzooplankton
89         CALL p4z_meso ( kt, knt, Kbb,      Krhs )     ! mesozooplankton
90      ELSE
91         CALL p5z_lim  ( kt, knt, Kbb, Kmm       )     ! co-limitations by the various nutrients
92         CALL p5z_prod ( kt, knt, Kbb, Kmm, Krhs )     ! phytoplankton growth rate over the global ocean.
93         !                                          ! (for each element : C, Si, Fe, Chl )
94         CALL p5z_mort ( kt,      Kbb,      Krhs      )     ! phytoplankton mortality
95         !                                          ! zooplankton sources/sinks routines
96         CALL p5z_micro( kt, knt, Kbb,      Krhs )           ! microzooplankton
97         CALL p5z_meso ( kt, knt, Kbb,      Krhs )           ! mesozooplankton
98      ENDIF
99      !
100      CALL p4z_agg     ( kt, knt, Kbb,      Krhs )     ! Aggregation of particles
101      CALL p4z_rem     ( kt, knt, Kbb, Kmm, Krhs )     ! remineralization terms of organic matter+scavenging of Fe
102      CALL p4z_poc     ( kt, knt, Kbb, Kmm, Krhs )     ! Remineralization of organic particles
103      !
104      IF( ln_ligand )  &
105      & CALL p4z_ligand( kt, knt, Kbb,      Krhs )
106      !                                                             !
107      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
108         WRITE(charout, FMT="('bio ')")
109         CALL prt_ctl_trc_info(charout)
110         CALL prt_ctl_trc(tab4d=tr(:,:,:,:,Krhs), mask=tmask, clinfo=ctrcnm)
111      ENDIF
112      !
113      IF( ln_timing )   CALL timing_stop('p4z_bio')
114      !
115   END SUBROUTINE p4z_bio
116
117   !!======================================================================
118END MODULE p4zbio
Note: See TracBrowser for help on using the repository browser.