Changeset 10308 for branches/UKMO/AMM15_v3_6_STABLE_package_collate_bgc_diagnostics/NEMOGCM/NEMO/TOP_SRC/FABM/trcini_fabm.F90
- Timestamp:
- 2018-11-14T18:42:09+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/AMM15_v3_6_STABLE_package_collate_bgc_diagnostics/NEMOGCM/NEMO/TOP_SRC/FABM/trcini_fabm.F90
r10158 r10308 18 18 USE trcsms_fabm 19 19 USE fabm_config,ONLY: fabm_create_model_from_yaml_file 20 USE fabm,ONLY: type_external_variable, fabm_initialize_library 20 USE fabm,ONLY: type_external_variable, fabm_initialize_library, & 21 fabm_get_bulk_diagnostic_data 21 22 USE inputs_fabm,ONLY: initialize_inputs,link_inputs, & 22 23 type_input_variable,type_input_data,type_river_data, & … … 65 66 jp_fabm_m1=jptra 66 67 jptra = jptra + jp_fabm 67 jpdia2d = jpdia2d + size(model%horizontal_diagnostic_variables) 68 jpdia3d = jpdia3d + size(model%diagnostic_variables) 68 jp_fabm_2d = size(model%horizontal_diagnostic_variables) 69 jp_fabm_3d = size(model%diagnostic_variables) 70 jpdia2d = jpdia2d + jp_fabm_2d 71 jpdia3d = jpdia3d + jp_fabm_3d 69 72 jpdiabio = jpdiabio + jp_fabm 70 73 71 74 !Initialize input data structures. 72 75 call initialize_inputs 76 77 ! Get indexes for select state variables 78 jp_fabm_chl1 = fabm_state_index( 'P1_Chl' ) 79 jp_fabm_chl2 = fabm_state_index( 'P2_Chl' ) 80 jp_fabm_chl3 = fabm_state_index( 'P3_Chl' ) 81 jp_fabm_chl4 = fabm_state_index( 'P4_Chl' ) 82 jp_fabm_p1c = fabm_state_index( 'P1_c' ) 83 jp_fabm_p1n = fabm_state_index( 'P1_n' ) 84 jp_fabm_p1p = fabm_state_index( 'P1_p' ) 85 jp_fabm_p1s = fabm_state_index( 'P1_s' ) 86 jp_fabm_p2c = fabm_state_index( 'P2_c' ) 87 jp_fabm_p2n = fabm_state_index( 'P2_n' ) 88 jp_fabm_p2p = fabm_state_index( 'P2_p' ) 89 jp_fabm_p3c = fabm_state_index( 'P3_c' ) 90 jp_fabm_p3n = fabm_state_index( 'P3_n' ) 91 jp_fabm_p3p = fabm_state_index( 'P3_p' ) 92 jp_fabm_p4c = fabm_state_index( 'P4_c' ) 93 jp_fabm_p4n = fabm_state_index( 'P4_n' ) 94 jp_fabm_p4p = fabm_state_index( 'P4_p' ) 95 jp_fabm_z4c = fabm_state_index( 'Z4_c' ) 96 jp_fabm_z5c = fabm_state_index( 'Z5_c' ) 97 jp_fabm_z5n = fabm_state_index( 'Z5_n' ) 98 jp_fabm_z5p = fabm_state_index( 'Z5_p' ) 99 jp_fabm_z6c = fabm_state_index( 'Z6_c' ) 100 jp_fabm_z6n = fabm_state_index( 'Z6_n' ) 101 jp_fabm_z6p = fabm_state_index( 'Z6_p' ) 102 jp_fabm_n1p = fabm_state_index( 'N1_p' ) 103 jp_fabm_n3n = fabm_state_index( 'N3_n' ) 104 jp_fabm_n4n = fabm_state_index( 'N4_n' ) 105 jp_fabm_n5s = fabm_state_index( 'N5_s' ) 106 jp_fabm_o2o = fabm_state_index( 'O2_o' ) 107 jp_fabm_o3c = fabm_state_index( 'O3_c' ) 108 jp_fabm_o3a = fabm_state_index( 'O3_bioalk' ) 109 110 ! Get indexes for select diagnostic variables 111 jp_fabm_o3ph = fabm_diag_index( 'O3_pH' ) 112 jp_fabm_o3pc = fabm_diag_index( 'O3_pCO2' ) 113 jp_fabm_xeps = fabm_diag_index( 'light_xEPS') 73 114 74 115 IF (lwp) THEN … … 84 125 CALL write_trends_xml(xml_unit,model%state_variables(jn)) 85 126 #endif 127 CALL write_25hourm_xml(xml_unit,model%state_variables(jn)) 128 CALL write_tmb_xml(xml_unit,model%state_variables(jn)) 86 129 END DO 87 130 WRITE (xml_unit,1000) ' </field_group>' … … 90 133 DO jn=1,jp_fabm_surface 91 134 CALL write_variable_xml(xml_unit,model%surface_state_variables(jn)) 135 CALL write_25hourm_xml(xml_unit,model%surface_state_variables(jn)) 92 136 END DO 93 137 DO jn=1,jp_fabm_bottom 94 138 CALL write_variable_xml(xml_unit,model%bottom_state_variables(jn)) 139 CALL write_25hourm_xml(xml_unit,model%bottom_state_variables(jn)) 95 140 END DO 96 141 WRITE (xml_unit,1000) ' </field_group>' … … 99 144 DO jn=1,size(model%diagnostic_variables) 100 145 CALL write_variable_xml(xml_unit,model%diagnostic_variables(jn),3) 146 CALL write_25hourm_xml(xml_unit,model%diagnostic_variables(jn),3) 147 CALL write_tmb_xml(xml_unit,model%diagnostic_variables(jn)) 101 148 END DO 102 149 DO jn=1,size(model%horizontal_diagnostic_variables) 103 150 CALL write_variable_xml(xml_unit,model%horizontal_diagnostic_variables(jn)) 104 END DO 151 CALL write_25hourm_xml(xml_unit,model%horizontal_diagnostic_variables(jn)) 152 END DO 153 WRITE (xml_unit,'(A)') ' <field id="visib" long_name="visibility" unit="m" default_value="1.e+20" grid_ref="grid_T_3D" />' 154 WRITE (xml_unit,'(A)') ' <field id="visib25h" long_name="visibility 25-hour mean" unit="m" default_value="1.e+20" grid_ref="grid_T_3D" />' 155 WRITE (xml_unit,'(A)') ' <field id="top_visib" long_name="Top-level visibility" unit="m" default_value="1.e+20" grid_ref="grid_T_2D" />' 156 WRITE (xml_unit,'(A)') ' <field id="mid_visib" long_name="Middle-level visibility" unit="m" default_value="1.e+20" grid_ref="grid_T_2D" />' 157 WRITE (xml_unit,'(A)') ' <field id="bot_visib" long_name="Bottom-level visibility" unit="m" default_value="1.e+20" grid_ref="grid_T_2D" />' 105 158 WRITE (xml_unit,1000) ' </field_group>' 106 159 … … 168 221 169 222 END SUBROUTINE write_variable_xml 223 224 SUBROUTINE write_25hourm_xml(xml_unit,variable,flag_grid_ref) 225 INTEGER,INTENT(IN) :: xml_unit 226 INTEGER,INTENT(IN),OPTIONAL :: flag_grid_ref 227 CLASS (type_external_variable),INTENT(IN) :: variable 228 229 CHARACTER(LEN=20) :: missing_value,string_dimensions 230 INTEGER :: number_dimensions 231 232 ! Check variable dimension for grid_ref specificaiton. 233 ! Default is to not specify the grid_ref in the field definition. 234 IF (present(flag_grid_ref)) THEN 235 number_dimensions=flag_grid_ref 236 ELSE 237 number_dimensions=-1 !default, don't specify grid_ref 238 ENDIF 239 240 WRITE (missing_value,'(E9.3)') 1.e+20 241 WRITE (string_dimensions,'(I1)') number_dimensions 242 SELECT CASE (number_dimensions) 243 CASE (3) 244 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" />' 245 CASE (2) 246 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"/>' 247 CASE (0) 248 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"/>' 249 CASE (-1) 250 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))//'" />' 251 CASE default 252 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!!!' 253 END SELECT 254 255 END SUBROUTINE write_25hourm_xml 256 257 SUBROUTINE write_tmb_xml(xml_unit,variable) 258 INTEGER,INTENT(IN) :: xml_unit 259 CLASS (type_external_variable),INTENT(IN) :: variable 260 261 CHARACTER(LEN=20) :: missing_value 262 263 WRITE (missing_value,'(E9.3)') 1.e+20 264 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"/>' 265 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"/>' 266 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"/>' 267 268 END SUBROUTINE write_tmb_xml 170 269 171 270 SUBROUTINE write_trends_xml(xml_unit,variable,flag_grid_ref) … … 304 403 #endif 305 404 405 ! Initialise visibility 406 visib(:,:,:) = 1.7 / fabm_get_bulk_diagnostic_data(model, jp_fabm_xeps) 407 306 408 ! Log mapping of FABM states: 307 409 IF (lwp) THEN … … 328 430 END SUBROUTINE trc_ini_fabm 329 431 432 INTEGER FUNCTION fabm_state_index( state_name ) 433 !!---------------------------------------------------------------------- 434 !! *** fabm_state_index *** 435 !! 436 !! ** Purpose : return index of a given FABM state variable 437 !! 438 !! ** Method : - loop through state variables until found 439 !!---------------------------------------------------------------------- 440 441 IMPLICIT NONE 442 443 CHARACTER(LEN=256), INTENT(IN) :: state_name 444 445 INTEGER :: jn 446 447 !!---------------------------------------------------------------------- 448 449 fabm_state_index = -1 450 DO jn=1,jp_fabm 451 IF (TRIM(model%state_variables(jn)%name) == TRIM(state_name)) THEN 452 fabm_state_index = jn 453 EXIT 454 ENDIF 455 END DO 456 IF (fabm_state_index == -1) THEN 457 CALL ctl_stop( 'Could not find '//TRIM(state_name)//' state variable' ) 458 ELSE 459 IF (lwp) WRITE(numout,*) 'Index for '//TRIM(state_name)//' is: ', fabm_state_index 460 ENDIF 461 462 END FUNCTION fabm_state_index 463 464 INTEGER FUNCTION fabm_diag_index( diag_name ) 465 !!---------------------------------------------------------------------- 466 !! *** fabm_state_index *** 467 !! 468 !! ** Purpose : return index of a given FABM diagnostic variable 469 !! 470 !! ** Method : - loop through diagnostic variables until found 471 !!---------------------------------------------------------------------- 472 473 IMPLICIT NONE 474 475 CHARACTER(LEN=256), INTENT(IN) :: diag_name 476 477 INTEGER :: jn 478 479 !!---------------------------------------------------------------------- 480 481 fabm_diag_index = -1 482 DO jn = 1, SIZE(model%diagnostic_variables) 483 IF (TRIM(model%diagnostic_variables(jn)%name) == TRIM(diag_name)) THEN 484 fabm_diag_index = jn 485 EXIT 486 ENDIF 487 END DO 488 IF (fabm_diag_index == -1) THEN 489 CALL ctl_stop( 'Could not find '//TRIM(diag_name)//' diagnostic' ) 490 ELSE 491 IF (lwp) WRITE(numout,*) 'Index for '//TRIM(diag_name)//' is: ', fabm_diag_index 492 ENDIF 493 494 END FUNCTION fabm_diag_index 495 330 496 #else 331 497 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.