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.
trcini_fabm.F90 in branches/UKMO/AMM15_v3_6_STABLE_package_collate/NEMOGCM/NEMO/TOP_SRC/FABM – NEMO

source: branches/UKMO/AMM15_v3_6_STABLE_package_collate/NEMOGCM/NEMO/TOP_SRC/FABM/trcini_fabm.F90

Last change on this file was 13576, checked in by dford, 4 years ago

Update NEMO-FABM coupler for FABM v1, and introduce two-way NEMO-ERSEM coupling options. See https://code.metoffice.gov.uk/trac/utils/ticket/366.

File size: 26.0 KB
Line 
1MODULE trcini_fabm
2   !!======================================================================
3   !!                         ***  MODULE trcini_fabm  ***
4   !! TOP :   initialisation of the FABM tracers
5   !!======================================================================
6   !! History :   1.0  !  2015-04  (PML) Original code
7   !! History :   1.1  !  2020-06  (PML) Update to FABM 1.0, improved performance
8   !!----------------------------------------------------------------------
9#if defined key_fabm
10   !!----------------------------------------------------------------------
11   !!   'key_fabm'                                               FABM tracers
12   !!----------------------------------------------------------------------
13   !! trc_ini_fabm   : FABM model initialisation
14   !!----------------------------------------------------------------------
15   USE par_trc         ! TOP parameters
16   USE oce_trc
17   USE trc
18   USE par_fabm
19   USE trcsms_fabm
20   USE fabm, only: fabm_create_model, type_fabm_variable
21   USE fabm_driver
22   USE inputs_fabm,ONLY: initialize_inputs, link_inputs, &
23     type_input_variable,type_input_data,type_river_data, &
24     first_input_data,first_river_data
25#if defined key_git_version
26   USE fabm_version,ONLY: fabm_commit_id=>git_commit_id, &
27                          fabm_branch_name=>git_branch_name
28   USE fabm_types,ONLY: type_version,first_module_version
29#endif
30
31
32   IMPLICIT NONE
33   PRIVATE
34
35#if defined key_git_version
36#  include "gitversion.h90"
37   CHARACTER(len=*),parameter :: git_commit_id = _NEMO_COMMIT_ID_
38   CHARACTER(len=*),parameter :: git_branch_name = _NEMO_BRANCH_
39#endif
40
41   PUBLIC   trc_ini_fabm   ! called by trcini.F90 module
42   PUBLIC   nemo_fabm_configure
43
44   TYPE,extends(type_base_driver) :: type_nemo_fabm_driver
45   contains
46      procedure :: fatal_error => nemo_fabm_driver_fatal_error
47      procedure :: log_message => nemo_fabm_driver_log_message
48   end type
49
50   !!----------------------------------------------------------------------
51   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
52   !! $Id$
53   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
54   !!----------------------------------------------------------------------
55CONTAINS
56
57   SUBROUTINE nemo_fabm_configure()
58      INTEGER :: jn
59      INTEGER, PARAMETER :: xml_unit = 1979
60      TYPE (type_input_data),POINTER :: input_data
61      TYPE (type_river_data),POINTER :: river_data
62      CLASS (type_input_variable),POINTER :: input_pointer
63
64      ALLOCATE(type_nemo_fabm_driver::driver)
65
66      ! Allow FABM to parse fabm.yaml. This ensures numbers of variables are known.
67      model => fabm_create_model()
68
69      jp_fabm = size(model%interior_state_variables)
70      jp_fabm_bottom = size(model%bottom_state_variables)
71      jp_fabm_surface = size(model%surface_state_variables)
72      jp_fabm0 = jptra + 1
73      jp_fabm1 = jptra + jp_fabm
74      jp_fabm_m1=jptra
75      jptra = jptra + jp_fabm
76      jp_fabm_2d = size(model%horizontal_diagnostic_variables)
77      jp_fabm_3d = size(model%interior_diagnostic_variables)
78      jpdia2d = jpdia2d + jp_fabm_2d
79      jpdia3d = jpdia3d + jp_fabm_3d
80      jpdiabio = jpdiabio + jp_fabm
81
82      ! Read inputs (river and additional 2D forcing) from fabm_input.nml
83      ! This must be done before writing field_def_fabm.xml, as that file
84      ! also describes the additional input variables.
85      call initialize_inputs
86
87      ! Get indexes for select state variables
88      jp_fabm_chl1 = fabm_state_index( 'P1_Chl' )
89      jp_fabm_chl2 = fabm_state_index( 'P2_Chl' )
90      jp_fabm_chl3 = fabm_state_index( 'P3_Chl' )
91      jp_fabm_chl4 = fabm_state_index( 'P4_Chl' )
92      jp_fabm_p1c  = fabm_state_index( 'P1_c' )
93      jp_fabm_p1n  = fabm_state_index( 'P1_n' )
94      jp_fabm_p1p  = fabm_state_index( 'P1_p' )
95      jp_fabm_p1s  = fabm_state_index( 'P1_s' )
96      jp_fabm_p2c  = fabm_state_index( 'P2_c' )
97      jp_fabm_p2n  = fabm_state_index( 'P2_n' )
98      jp_fabm_p2p  = fabm_state_index( 'P2_p' )
99      jp_fabm_p3c  = fabm_state_index( 'P3_c' )
100      jp_fabm_p3n  = fabm_state_index( 'P3_n' )
101      jp_fabm_p3p  = fabm_state_index( 'P3_p' )
102      jp_fabm_p4c  = fabm_state_index( 'P4_c' )
103      jp_fabm_p4n  = fabm_state_index( 'P4_n' )
104      jp_fabm_p4p  = fabm_state_index( 'P4_p' )
105      jp_fabm_z4c  = fabm_state_index( 'Z4_c' )
106      jp_fabm_z5c  = fabm_state_index( 'Z5_c' )
107      jp_fabm_z5n  = fabm_state_index( 'Z5_n' )
108      jp_fabm_z5p  = fabm_state_index( 'Z5_p' )
109      jp_fabm_z6c  = fabm_state_index( 'Z6_c' )
110      jp_fabm_z6n  = fabm_state_index( 'Z6_n' )
111      jp_fabm_z6p  = fabm_state_index( 'Z6_p' )
112      jp_fabm_n1p  = fabm_state_index( 'N1_p' )
113      jp_fabm_n3n  = fabm_state_index( 'N3_n' )
114      jp_fabm_n4n  = fabm_state_index( 'N4_n' )
115      jp_fabm_n5s  = fabm_state_index( 'N5_s' )
116      jp_fabm_o2o  = fabm_state_index( 'O2_o' )
117      jp_fabm_o3c  = fabm_state_index( 'O3_c' )
118      jp_fabm_o3ba = fabm_state_index( 'O3_bioalk' )
119      jp_fabm_r4n  = fabm_state_index( 'R4_n' )
120      jp_fabm_r4c  = fabm_state_index( 'R4_c' )
121      jp_fabm_r4p  = fabm_state_index( 'R4_p' )
122      jp_fabm_r6n  = fabm_state_index( 'R6_n' )
123      jp_fabm_r6c  = fabm_state_index( 'R6_c' )
124      jp_fabm_r6p  = fabm_state_index( 'R6_p' )
125      jp_fabm_r6s  = fabm_state_index( 'R6_s' )
126      jp_fabm_r8n  = fabm_state_index( 'R8_n' )
127      jp_fabm_r8c  = fabm_state_index( 'R8_c' )
128      jp_fabm_r8p  = fabm_state_index( 'R8_p' )
129      jp_fabm_r8s  = fabm_state_index( 'R8_s' )
130
131      ! Get indexes for select diagnostic variables
132      jp_fabm_o3ta  = fabm_diag_index( 'O3_TA' )
133      jp_fabm_o3ph  = fabm_diag_index( 'O3_pH' )
134      jp_fabm_o3pc  = fabm_diag_index( 'O3_pCO2' )
135      jp_fabm_xeps  = fabm_diag_index( 'light_xEPS' )
136      jp_fabm_swr   = fabm_diag_index( 'light_swr_abs' )
137      jp_fabm_kd490 = fabm_diag_index( 'light_Kd_band3' )
138      jp_fabm_pgrow = fabm_diag_index( 'p_grow_sum_result' )
139      jp_fabm_ploss = fabm_diag_index( 'p_loss_sum_result' )
140
141      IF (lwp) THEN
142         ! write field_def_fabm.xml on lead process
143         OPEN(UNIT=xml_unit, FILE='field_def_fabm.xml', ACTION='WRITE', STATUS='REPLACE')
144
145         WRITE (xml_unit,1000) '<field_definition level="1" prec="4" operation="average" enabled=".TRUE." default_value="1.e20" >'
146
147         WRITE (xml_unit,1000) ' <field_group id="ptrc_T" grid_ref="grid_T_3D">'
148         DO jn=1,jp_fabm
149            CALL write_variable_xml(xml_unit,model%interior_state_variables(jn))
150#if defined key_trdtrc
151            CALL write_trends_xml(xml_unit,model%interior_state_variables(jn))
152#endif
153            CALL write_25hourm_xml(xml_unit,model%interior_state_variables(jn))
154            CALL write_tmb_xml(xml_unit,model%interior_state_variables(jn))
155         END DO
156         WRITE (xml_unit,1000) ' </field_group>'
157
158         WRITE (xml_unit,1000) ' <field_group id="sf_T" grid_ref="grid_T_2D">'
159         DO jn=1,jp_fabm_surface
160            CALL write_variable_xml(xml_unit,model%surface_state_variables(jn))
161            CALL write_25hourm_xml(xml_unit,model%surface_state_variables(jn))
162         END DO
163         DO jn=1,jp_fabm_bottom
164            CALL write_variable_xml(xml_unit,model%bottom_state_variables(jn))
165            CALL write_25hourm_xml(xml_unit,model%bottom_state_variables(jn))
166         END DO
167         WRITE (xml_unit,1000) ' </field_group>'
168
169         WRITE (xml_unit,1000) ' <field_group id="diad_T" grid_ref="grid_T_2D">'
170         DO jn=1,size(model%interior_diagnostic_variables)
171            CALL write_variable_xml(xml_unit,model%interior_diagnostic_variables(jn),3)
172            CALL write_25hourm_xml(xml_unit,model%interior_diagnostic_variables(jn),3)
173            CALL write_tmb_xml(xml_unit,model%interior_diagnostic_variables(jn))
174         END DO
175         DO jn=1,size(model%horizontal_diagnostic_variables)
176            CALL write_variable_xml(xml_unit,model%horizontal_diagnostic_variables(jn))
177            CALL write_25hourm_xml(xml_unit,model%horizontal_diagnostic_variables(jn))
178         END DO
179         DO jn=1,size(model%interior_state_variables)
180            WRITE (xml_unit,'(A)') '  <field id="'//TRIM(model%interior_state_variables(jn)%name)// &
181               &                   '_VINT" long_name="depth-integrated '//TRIM(model%interior_state_variables(jn)%long_name)// &
182               &                   '" unit="'//TRIM(model%interior_state_variables(jn)%units)//'*m" default_value="0.0" />'
183         END DO
184         DO jn=1,size(model%interior_diagnostic_variables)
185            WRITE (xml_unit,'(A)') '  <field id="'//TRIM(model%interior_diagnostic_variables(jn)%name)// &
186               &                   '_VINT" long_name="depth-integrated '//TRIM(model%interior_diagnostic_variables(jn)%long_name)// &
187               &                   '" unit="'//TRIM(model%interior_diagnostic_variables(jn)%units)//'*m" default_value="0.0" />'
188         END DO
189         WRITE (xml_unit,1000) ' </field_group>'
190
191         WRITE (xml_unit,1000) ' <field_group id="fabm_scalar" grid_ref="grid_0">'
192         DO jn=1,size(model%conserved_quantities)
193            CALL write_variable_xml(xml_unit,model%conserved_quantities(jn))
194         END DO
195         WRITE (xml_unit,1000) ' </field_group>'
196
197         WRITE (xml_unit,1000) ' <field_group id="fabm_input" grid_ref="grid_T_2D">'
198         input_data => first_input_data
199         DO WHILE (ASSOCIATED(input_data))
200           input_pointer => input_data
201           CALL write_input_xml(xml_unit,input_pointer)
202            input_data => input_data%next
203         END DO
204         river_data => first_river_data
205         DO WHILE (ASSOCIATED(river_data))
206           input_pointer => river_data
207           CALL write_input_xml(xml_unit,input_pointer,3)
208            river_data => river_data%next
209         END DO
210         WRITE (xml_unit,1000) ' </field_group>'
211
212         WRITE (xml_unit,1000) '</field_definition>'
213
214         CLOSE(xml_unit)
215      END IF
216      IF( lk_mpp )   CALL mppsync !Ensure field_def_fabm is ready.
217
2181000 FORMAT (A)
219
220   END SUBROUTINE nemo_fabm_configure
221
222   SUBROUTINE write_variable_xml(xml_unit,variable,flag_grid_ref)
223      INTEGER,INTENT(IN) :: xml_unit
224      INTEGER,INTENT(IN),OPTIONAL :: flag_grid_ref
225      CLASS (type_fabm_variable),INTENT(IN) :: variable
226
227      CHARACTER(LEN=20) :: missing_value,string_dimensions
228      INTEGER :: number_dimensions
229
230      ! Check variable dimension for grid_ref specificaiton.
231      ! Default is to not specify the grid_ref in the field definition.
232      IF (present(flag_grid_ref)) THEN
233          number_dimensions=flag_grid_ref
234      ELSE
235          number_dimensions=-1 !default, don't specify grid_ref
236      ENDIF
237
238      WRITE (missing_value,'(E9.3)') variable%missing_value
239      WRITE (string_dimensions,'(I1)') number_dimensions
240      SELECT CASE (number_dimensions)
241      CASE (3)
242         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'" long_name="'//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
243      CASE (2)
244         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'" long_name="'//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_2D"/>'
245      CASE (0)
246         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'" long_name="'//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="1point"/>'
247      CASE (-1)
248         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'" long_name="'//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" />'
249      CASE default
250         IF(lwp) WRITE(numout,*) ' trc_ini_fabm: Failing to initialise output of variable '//TRIM(variable%name)//': Output of '//TRIM(ADJUSTL(string_dimensions))//'-dimensional variables not supported!!!'
251      END SELECT
252
253   END SUBROUTINE write_variable_xml
254
255   SUBROUTINE write_25hourm_xml(xml_unit,variable,flag_grid_ref)
256      INTEGER,INTENT(IN) :: xml_unit
257      INTEGER,INTENT(IN),OPTIONAL :: flag_grid_ref
258      CLASS (type_fabm_variable),INTENT(IN) :: variable
259
260      CHARACTER(LEN=20) :: missing_value,string_dimensions
261      INTEGER :: number_dimensions
262
263      ! Check variable dimension for grid_ref specificaiton.
264      ! Default is to not specify the grid_ref in the field definition.
265      IF (present(flag_grid_ref)) THEN
266          number_dimensions=flag_grid_ref
267      ELSE
268          number_dimensions=-1 !default, don't specify grid_ref
269      ENDIF
270
271      WRITE (missing_value,'(E9.3)') 1.e+20
272      WRITE (string_dimensions,'(I1)') number_dimensions
273      SELECT CASE (number_dimensions)
274      CASE (3)
275         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'25h'//'" long_name="'//TRIM(variable%long_name)//' 25-hour mean'//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
276      CASE (2)
277         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'25h'//'" long_name="'//TRIM(variable%long_name)//' 25-hour mean'//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_2D"/>'
278      CASE (0)
279         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'25h'//'" long_name="'//TRIM(variable%long_name)//' 25-hour mean'//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="1point"/>'
280      CASE (-1)
281         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'25h'//'" long_name="'//TRIM(variable%long_name)//' 25-hour mean'//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" />'
282      CASE default
283         IF(lwp) WRITE(numout,*) ' trc_ini_fabm: Failing to initialise output of variable '//TRIM(variable%name)//'25h'//': Output of '//TRIM(ADJUSTL(string_dimensions))//'-dimensional variables not supported!!!'
284      END SELECT
285
286   END SUBROUTINE write_25hourm_xml
287
288   SUBROUTINE write_tmb_xml(xml_unit,variable)
289      INTEGER,INTENT(IN) :: xml_unit
290      CLASS (type_fabm_variable),INTENT(IN) :: variable
291
292      CHARACTER(LEN=20) :: missing_value
293
294      WRITE (missing_value,'(E9.3)') 1.e+20
295      WRITE (xml_unit,'(A)') '  <field id="top_'//TRIM(variable%name)//'" long_name="Top-level '//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_2D"/>'
296      WRITE (xml_unit,'(A)') '  <field id="mid_'//TRIM(variable%name)//'" long_name="Middle-level '//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_2D"/>'
297      WRITE (xml_unit,'(A)') '  <field id="bot_'//TRIM(variable%name)//'" long_name="Bottom-level '//TRIM(variable%long_name)//'" unit="'//TRIM(variable%units)//'" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_2D"/>'
298
299   END SUBROUTINE write_tmb_xml
300
301   SUBROUTINE write_trends_xml(xml_unit,variable,flag_grid_ref)
302      INTEGER,INTENT(IN) :: xml_unit
303      INTEGER,INTENT(IN),OPTIONAL :: flag_grid_ref
304      CLASS (type_fabm_variable),INTENT(IN) :: variable
305
306      INTEGER :: number_dimensions,i
307      CHARACTER(LEN=20) :: missing_value,string_dimensions
308#if defined key_tracer_budget
309      CHARACTER(LEN=3),DIMENSION(10),PARAMETER :: trd_tags = (/ &
310        'LDF','BBL','FOR','ZDF','DMP','SMS','ATF', &
311        'RDB','RDN','VMV' /)
312      CHARACTER(LEN=3),DIMENSION(3),PARAMETER :: trd_e3t_tags = (/ &
313        'XAD','YAD','ZAD' /)
314#else
315      CHARACTER(LEN=3),DIMENSION(13),PARAMETER :: trd_tags = (/ &
316        'XAD','YAD','ZAD','LDF','BBL','FOR','ZDF','DMP','SMS','ATF', &
317        'RDB','RDN','VMV' /)
318#endif
319
320      ! Check variable dimension for grid_ref specificaiton.
321      ! Default is to not specify the grid_ref in the field definition.
322      IF (present(flag_grid_ref)) THEN
323          number_dimensions=flag_grid_ref
324      ELSE
325          number_dimensions=-1 !default, don't specify grid_ref
326      ENDIF
327
328      WRITE (missing_value,'(E9.3)') -2.E20
329      WRITE (string_dimensions,'(I1)') number_dimensions
330      SELECT CASE (number_dimensions)
331      CASE (3)
332        DO i=1,size(trd_tags)
333         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(trd_tags(i))//'_'//TRIM(variable%name)//'" long_name="'// &
334            &                   TRIM(variable%long_name)//' '//TRIM(trd_tags(i))//' trend" unit="'//            &
335            &                   TRIM(variable%units)//'/s" default_value="'//                                   &
336            &                   TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
337        END DO
338#if defined key_tracer_budget
339        DO i=1,size(trd_e3t_tags)
340         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(trd_e3t_tags(i))//'_'//TRIM(variable%name)//                     &
341            &                   '_e3t" long_name="'//TRIM(variable%long_name)//' cell depth integrated '//             &
342            &                   TRIM(trd_e3t_tags(i))//' trend" unit="'//TRIM(variable%units)//'/s" default_value="'// &
343            &                   TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
344        END DO
345        WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'_e3t" long_name="'//TRIM(variable%long_name)// &
346           &                   ' cell depth integrated" unit="'//TRIM(variable%units)//'/s" default_value="'//       &
347           &                   TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
348#endif
349      CASE (-1)
350        DO i=1,size(trd_tags)
351         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(trd_tags(i))//'_'//TRIM(variable%name)//'" long_name="'//   &
352            &                   TRIM(variable%long_name)//' '//TRIM(trd_tags(i))//' trend" unit="'//              &
353            &                   TRIM(variable%units)//'/s" default_value="'//TRIM(ADJUSTL(missing_value))//'" />'
354        END DO
355#if defined key_tracer_budget
356        DO i=1,size(trd_e3t_tags)
357         WRITE (xml_unit,'(A)') '  <field id="'//TRIM(trd_e3t_tags(i))//'_'//TRIM(variable%name)//                     &
358            &                   '_e3t" long_name="'//TRIM(variable%long_name)//' cell depth integrated '//             &
359            &                   TRIM(trd_e3t_tags(i))//' trend" unit="'//TRIM(variable%units)//'/s" default_value="'// &
360            &                   TRIM(ADJUSTL(missing_value))//'" />'
361        END DO
362        WRITE (xml_unit,'(A)') '  <field id="'//TRIM(variable%name)//'_e3t" long_name="'//TRIM(variable%long_name)// &
363           &                   ' cell depth integrated" unit="'//TRIM(variable%units)//'/s" default_value="'//       &
364           &                   TRIM(ADJUSTL(missing_value))//'" />'
365#endif
366      CASE default
367         IF(lwp) WRITE(numout,*) ' trc_ini_fabm: Failing to initialise trends of variable '//TRIM(variable%name)// &
368            &                    ': Output of '//TRIM(ADJUSTL(string_dimensions))//'-dimensional trends not supported!!!'
369      END SELECT
370
371   END SUBROUTINE write_trends_xml
372
373   SUBROUTINE write_input_xml(xml_unit,variable,flag_grid_ref)
374      INTEGER,INTENT(IN) :: xml_unit
375      INTEGER,INTENT(IN),OPTIONAL :: flag_grid_ref
376      CLASS(type_input_variable),POINTER,INTENT(IN) :: variable
377
378      INTEGER :: number_dimensions,i
379      CHARACTER(LEN=20) :: missing_value,string_dimensions
380
381      ! Check variable dimension for grid_ref specificaiton.
382      ! Default is to not specify the grid_ref in the field definition.
383      IF (present(flag_grid_ref)) THEN
384          number_dimensions=flag_grid_ref
385      ELSE
386          number_dimensions=-1 !default, don't specify grid_ref
387      ENDIF
388
389      WRITE (missing_value,'(E9.3)') -2.E20
390      WRITE (string_dimensions,'(I1)') number_dimensions
391      SELECT CASE (number_dimensions)
392      CASE (3)
393        WRITE (xml_unit,'(A)') '  <field id="'//'INP_'//TRIM(variable%sf(1)%clvar)//'" long_name="'//TRIM(variable%sf(1)%clvar)//' input" unit="" default_value="'//TRIM(ADJUSTL(missing_value))//'" grid_ref="grid_T_3D" />'
394      CASE (-1)
395        WRITE (xml_unit,'(A)') '  <field id="'//'INP_'//TRIM(variable%sf(1)%clvar)//'" long_name="'//TRIM(variable%sf(1)%clvar)//' input" unit="" default_value="'//TRIM(ADJUSTL(missing_value))//'" />'
396      CASE default
397         IF(lwp) WRITE(numout,*) ' trc_ini_fabm: Failing to initialise input diagnostic of variable '//TRIM(variable%sf(1)%clvar)//': Output of '//TRIM(ADJUSTL(string_dimensions))//'-dimensional diagnostic not supported!!!'
398      END SELECT
399
400   END SUBROUTINE write_input_xml
401
402   SUBROUTINE trc_ini_fabm
403      !!----------------------------------------------------------------------
404      !!                     ***  trc_ini_fabm  ***
405      !!
406      !! ** Purpose :   initialization for FABM model
407      !!
408      !! ** Method  : - Allocate FABM arrays, configure domain, send data
409      !!----------------------------------------------------------------------
410#if defined key_git_version
411      TYPE (type_version), POINTER :: version
412#endif
413      INTEGER :: jn
414
415      IF(lwp) WRITE(numout,*)
416      IF(lwp) WRITE(numout,*) ' trc_ini_fabm: initialisation of FABM model'
417      IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
418#if defined key_git_version
419      IF(lwp) WRITE(numout,*) ' NEMO version:   ',git_commit_id,' (',git_branch_name,' branch)'
420      IF(lwp) WRITE(numout,*) ' FABM version:   ',fabm_commit_id,' (',fabm_branch_name,' branch)'
421      version => first_module_version
422      do while (associated(version))
423         IF(lwp) WRITE(numout,*)  ' '//trim(version%module_name)//' version:   ',trim(version%version_string)
424         version => version%next
425      end do
426#endif
427
428      ! Allocate FABM arrays
429      IF(trc_sms_fabm_alloc() /= 0) CALL ctl_stop( 'STOP', 'trc_ini_fabm: unable to allocate FABM arrays' )
430
431      ! Log mapping of FABM states:
432      IF (lwp) THEN
433         IF (jp_fabm > 0) WRITE(numout,*) " FABM tracers:"
434         DO jn=1,jp_fabm
435            WRITE(numout,*) "   State",jn,":",trim(model%interior_state_variables(jn)%name), &
436               " (",trim(model%interior_state_variables(jn)%long_name), &
437               ") [",trim(model%interior_state_variables(jn)%units),"]"
438         END DO
439         IF (jp_fabm_surface > 0) WRITE(numout,*) "FABM seasurface states:"
440         DO jn=1,jp_fabm_surface
441            WRITE(numout,*) "   State",jn,":",trim(model%surface_state_variables(jn)%name), &
442               " (",trim(model%surface_state_variables(jn)%long_name), &
443               ") [",trim(model%surface_state_variables(jn)%units),"]"
444         END DO
445         IF (jp_fabm_bottom > 0) WRITE(numout,*) "FABM seafloor states:"
446         DO jn=1,jp_fabm_bottom
447            WRITE(numout,*) "   State",jn,":",trim(model%bottom_state_variables(jn)%name), &
448               " (",trim(model%bottom_state_variables(jn)%long_name), &
449               ") [",trim(model%bottom_state_variables(jn)%units),"]"
450         END DO
451      END IF
452     
453      ! Initialise variables required for Hemmings et al. (2008)
454      ! nitrogen balancing for chlorophyll data assimilation
455      MLD_MAX(:,:)   = 0.0
456      PGROW_AVG(:,:) = 0.0
457      PLOSS_AVG(:,:) = 0.0
458      PHYT_AVG(:,:)  = 0.0
459
460   END SUBROUTINE trc_ini_fabm
461
462   SUBROUTINE nemo_fabm_driver_fatal_error(self, location, message)
463      CLASS (type_nemo_fabm_driver), INTENT(INOUT) :: self
464      CHARACTER(len=*),              INTENT(IN)    :: location, message
465
466      CALL ctl_stop('STOP', TRIM(location)//': '//TRIM(message))
467      STOP
468   END SUBROUTINE
469
470   SUBROUTINE nemo_fabm_driver_log_message(self, message)
471      CLASS (type_nemo_fabm_driver), INTENT(INOUT) :: self
472      CHARACTER(len=*),              INTENT(IN)    :: message
473
474      IF(lwp) WRITE (numout,*) TRIM(message)
475   END SUBROUTINE
476
477   INTEGER FUNCTION fabm_state_index( state_name )
478      !!----------------------------------------------------------------------
479      !!                     ***  fabm_state_index  *** 
480      !!
481      !! ** Purpose :   return index of a given FABM state variable
482      !!
483      !! ** Method  : - loop through state variables until found
484      !!----------------------------------------------------------------------
485     
486      IMPLICIT NONE
487     
488      CHARACTER(LEN=*), INTENT(IN) :: state_name
489     
490      INTEGER                      :: jn
491
492      !!----------------------------------------------------------------------
493     
494      fabm_state_index = -1
495      DO jn=1,jp_fabm
496         IF (TRIM(model%interior_state_variables(jn)%name) == TRIM(state_name)) THEN
497            fabm_state_index = jn
498            EXIT
499         ENDIF
500      END DO
501      IF (fabm_state_index == -1) THEN
502         CALL ctl_warn( 'Could not find '//TRIM(state_name)//' state variable' )
503      ELSE
504         IF (lwp) WRITE(numout,*) 'Index for '//TRIM(state_name)//' is: ', fabm_state_index
505      ENDIF
506   
507   END FUNCTION fabm_state_index
508
509   INTEGER FUNCTION fabm_diag_index( diag_name )
510      !!----------------------------------------------------------------------
511      !!                     ***  fabm_state_index  *** 
512      !!
513      !! ** Purpose :   return index of a given FABM diagnostic variable
514      !!
515      !! ** Method  : - loop through diagnostic variables until found
516      !!----------------------------------------------------------------------
517     
518      IMPLICIT NONE
519     
520      CHARACTER(LEN=*), INTENT(IN) :: diag_name
521     
522      INTEGER                      :: jn
523
524      !!----------------------------------------------------------------------
525     
526      fabm_diag_index = -1
527      DO jn = 1, SIZE(model%interior_diagnostic_variables)
528         IF (TRIM(model%interior_diagnostic_variables(jn)%name) == TRIM(diag_name)) THEN
529            fabm_diag_index = jn
530            EXIT
531         ENDIF
532      END DO
533      IF (fabm_diag_index == -1) THEN
534         CALL ctl_warn( 'Could not find '//TRIM(diag_name)//' diagnostic' )
535      ELSE
536         IF (lwp) WRITE(numout,*) 'Index for '//TRIM(diag_name)//' is: ', fabm_diag_index
537      ENDIF
538   
539   END FUNCTION fabm_diag_index
540
541#else
542   !!----------------------------------------------------------------------
543   !!   Dummy module                                        No FABM model
544   !!----------------------------------------------------------------------
545CONTAINS
546   SUBROUTINE nemo_fabm_init
547   END SUBROUTINE nemo_fabm_init
548
549   SUBROUTINE trc_ini_fabm            ! Empty routine
550   END SUBROUTINE trc_ini_fabm
551#endif
552
553   !!======================================================================
554END MODULE trcini_fabm
Note: See TracBrowser for help on using the repository browser.