LCOV - code coverage report
Current view: top level - configuration/driver - icedrv_InitMod.F90 (source / functions) Hit Total Coverage
Test: 200704-015006:b1e41d9f12:3:base,travis,quick Lines: 82 92 89.13 %
Date: 2020-07-03 20:11:40 Functions: 2 2 100.00 %

          Line data    Source code
       1             : !=======================================================================
       2             : !
       3             : !  This module contains the Icepack initialization routine that sets model
       4             : !  parameters and initializes the grid and state variables.
       5             : !
       6             : !  authors Elizabeth C. Hunke, LANL
       7             : 
       8             :       module icedrv_InitMod
       9             : 
      10             :       use icedrv_kinds
      11             :       use icedrv_constants, only: nu_diag
      12             :       use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
      13             :       use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags
      14             :       use icepack_intfc, only: icepack_write_tracer_flags, icepack_write_tracer_indices
      15             :       use icepack_intfc, only: icepack_write_tracer_sizes
      16             :       use icedrv_system, only: icedrv_system_abort
      17             : 
      18             :       implicit none
      19             :       private
      20             :       public :: icedrv_initialize
      21             : 
      22             : !=======================================================================
      23             : 
      24             :       contains
      25             : 
      26             : !=======================================================================
      27             : 
      28             : 
      29             : !  Initialize Icepack
      30             : 
      31          45 :       subroutine icedrv_initialize
      32             : 
      33             :       use icedrv_arrays_column, only: hin_max, c_hi_range
      34             :       use icedrv_arrays_column, only: floe_rad_l, floe_rad_c, &
      35             :           floe_binwidth, c_fsd_range
      36             :       use icedrv_calendar, only: dt, time, istep, istep1, &
      37             :           init_calendar, calendar
      38             :       use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist
      39             :       use icepack_intfc, only: icepack_init_fsd_bounds
      40             :       use icepack_intfc, only: icepack_warnings_flush
      41             :       use icedrv_domain_size, only: ncat, nfsd
      42             : !     use icedrv_diagnostics, only: icedrv_diagnostics_debug
      43             :       use icedrv_flux, only: init_coupler_flux, init_history_therm, &
      44             :           init_flux_atm_ocn
      45             :       use icedrv_forcing, only: init_forcing, get_forcing, get_wave_spec
      46             :       use icedrv_forcing_bgc, only: get_forcing_bgc, faero_default, fiso_default, init_forcing_bgc 
      47             :       use icedrv_restart_shared, only: restart
      48             :       use icedrv_init, only: input_data, init_state, init_grid2, init_fsd
      49             :       use icedrv_init_column, only: init_thermo_vertical, init_shortwave, init_zbgc
      50             :       use icepack_intfc, only: icepack_configure
      51             : 
      52             :       logical (kind=log_kind) :: &
      53             :          skl_bgc, &    ! from icepack
      54             :          z_tracers, &  ! from icepack
      55             :          tr_aero, &    ! from icepack
      56             :          tr_iso, &     ! from icepack
      57             :          tr_zaero, &   ! from icepack
      58             :          tr_fsd, wave_spec
      59             : 
      60             :       character(len=*), parameter :: subname='(icedrv_initialize)'
      61             : 
      62          45 :       call icepack_configure()  ! initialize icepack
      63          45 :       call icepack_warnings_flush(nu_diag)
      64          45 :       if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
      65           0 :           file=__FILE__,line= __LINE__)
      66             : 
      67          45 :       call input_data           ! namelist variables
      68          45 :       call init_zbgc            ! vertical biogeochemistry namelist
      69             : 
      70             :       ! generate some output
      71          45 :       call icepack_write_tracer_flags(nu_diag)
      72          45 :       call icepack_write_tracer_sizes(nu_diag)
      73          45 :       call icepack_write_tracer_indices(nu_diag)
      74          45 :       call icepack_warnings_flush(nu_diag)
      75          45 :       if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
      76           0 :           file=__FILE__,line= __LINE__)
      77             : 
      78          45 :       call init_grid2           ! grid variables
      79          45 :       call init_calendar        ! initialize some calendar stuff
      80          45 :       call init_coupler_flux    ! initialize fluxes exchanged with coupler
      81          45 :       call init_thermo_vertical ! initialize vertical thermodynamics
      82          45 :       call icepack_init_itd(ncat=ncat, hin_max=hin_max)
      83             : 
      84          45 :       call icepack_warnings_flush(nu_diag)
      85          45 :       if (icepack_warnings_aborted(subname)) then
      86           0 :          call icedrv_system_abort(file=__FILE__,line=__LINE__)
      87             :       endif
      88             : 
      89          45 :       call icepack_init_itd_hist(ncat=ncat, c_hi_range=c_hi_range, hin_max=hin_max) ! output
      90             : 
      91          45 :       call icepack_query_tracer_flags(tr_fsd_out=tr_fsd)
      92          45 :       call icepack_warnings_flush(nu_diag)
      93          45 :       if (icepack_warnings_aborted(subname)) then
      94           0 :          call icedrv_system_abort(file=__FILE__,line=__LINE__)
      95             :       endif
      96             : 
      97          45 :       if (tr_fsd) then
      98             :          call icepack_init_fsd_bounds(   &
      99             :             nfsd=nfsd,                   &  ! floe size distribution
     100             :             floe_rad_l=floe_rad_l,       &  ! fsd size lower bound in m (radius)
     101             :             floe_rad_c=floe_rad_c,       &  ! fsd size bin centre in m (radius)
     102             :             floe_binwidth=floe_binwidth, &  ! fsd size bin width in m (radius)
     103           4 :             c_fsd_range=c_fsd_range)        ! string for history output
     104           4 :          call icepack_warnings_flush(nu_diag)
     105           4 :          if (icepack_warnings_aborted(subname)) then
     106           0 :             call icedrv_system_abort(file=__FILE__,line=__LINE__)
     107             :          endif
     108             :       endif
     109          45 :       call init_fsd
     110             : 
     111          45 :       call calendar(time)       ! determine the initial date
     112             : 
     113          45 :       call init_state           ! initialize the ice state
     114          45 :       call init_restart         ! initialize restart variables
     115          45 :       call init_history_therm   ! initialize thermo history variables
     116             : 
     117          45 :       if (restart) &
     118          15 :          call init_shortwave    ! initialize radiative transfer
     119             : 
     120          45 :       istep  = istep  + 1    ! update time step counters
     121          45 :       istep1 = istep1 + 1
     122          45 :       time = time + dt       ! determine the time and date
     123          45 :       call calendar(time)    ! at the end of the first timestep
     124             : 
     125             :    !--------------------------------------------------------------------
     126             :    ! coupler communication or forcing data initialization
     127             :    !--------------------------------------------------------------------
     128          45 :       call icepack_query_parameters(skl_bgc_out=skl_bgc)
     129          45 :       call icepack_query_parameters(z_tracers_out=z_tracers)
     130          45 :       call icepack_query_parameters(wave_spec_out=wave_spec)
     131          45 :       call icepack_query_tracer_flags(tr_aero_out=tr_aero)
     132          45 :       call icepack_query_tracer_flags(tr_iso_out=tr_iso)
     133          45 :       call icepack_query_tracer_flags(tr_zaero_out=tr_zaero)
     134          45 :       call icepack_warnings_flush(nu_diag)
     135          45 :       if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
     136           0 :           file=__FILE__,line= __LINE__)
     137             : 
     138          45 :       call init_forcing      ! initialize forcing (standalone)     
     139          45 :       if (skl_bgc .or. z_tracers) call init_forcing_bgc !cn
     140          45 :       if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice
     141          45 :       call get_forcing(istep1)       ! get forcing from data arrays
     142             : 
     143          45 :       if (tr_iso)     call fiso_default                 ! default values
     144             :       ! aerosols
     145             :       ! if (tr_aero)  call faero_data                   ! data file
     146             :       ! if (tr_zaero) call fzaero_data                  ! data file (gx1)
     147          45 :       if (tr_aero .or. tr_zaero)  call faero_default    ! default values
     148          45 :       if (skl_bgc .or. z_tracers) call get_forcing_bgc  ! biogeochemistry
     149             : 
     150          45 :       if (.not. restart) &
     151          30 :          call init_shortwave    ! initialize radiative transfer using current swdn
     152             : 
     153          45 :       call init_flux_atm_ocn    ! initialize atmosphere, ocean fluxes
     154             : 
     155          45 :       end subroutine icedrv_initialize
     156             : 
     157             : !=======================================================================
     158             : 
     159          45 :       subroutine init_restart
     160             : 
     161             :       use icedrv_calendar, only: time, calendar
     162             :       use icepack_intfc, only: icepack_aggregate
     163             :       use icedrv_domain_size, only: ncat, max_ntrcr, nx
     164             :       use icedrv_init, only: ice_ic
     165             :       use icedrv_init, only: tmask
     166             :       use icedrv_init_column, only: init_hbrine, init_bgc
     167             :       use icedrv_restart, only: restartfile
     168             :       use icedrv_restart_shared, only: restart
     169             :       use icedrv_restart_bgc, only: read_restart_bgc
     170             :       use icedrv_state ! almost everything
     171             : 
     172             :       integer(kind=int_kind) :: &
     173             :          i                            ! horizontal indices
     174             : 
     175             :       logical (kind=log_kind) :: &
     176             :          skl_bgc, &    ! from icepack
     177             :          z_tracers, &  ! from icepack
     178             :          solve_zsal, & ! from icepack
     179             :          tr_brine, &   ! from icepack
     180             :          tr_fsd        ! from icepack
     181             : 
     182             :       character(len=*), parameter :: subname='(init_restart)'
     183             : 
     184             :       !-----------------------------------------------------------------
     185             :       ! query Icepack values
     186             :       !-----------------------------------------------------------------
     187             : 
     188          45 :       call icepack_query_parameters(skl_bgc_out=skl_bgc)
     189          45 :       call icepack_query_parameters(z_tracers_out=z_tracers)
     190          45 :       call icepack_query_parameters(solve_zsal_out=solve_zsal)
     191          45 :       call icepack_query_tracer_flags(tr_brine_out=tr_brine, tr_fsd_out=tr_fsd)
     192          45 :       call icepack_warnings_flush(nu_diag)
     193          45 :       if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
     194           0 :           file=__FILE__,line= __LINE__)
     195             : 
     196             :       !-----------------------------------------------------------------
     197             : 
     198          45 :       if (tr_brine .or. skl_bgc) then ! brine height tracer
     199           5 :         call init_hbrine
     200             :       endif
     201             : 
     202          45 :       if (restart) then
     203          15 :          call restartfile (ice_ic)
     204          15 :          call calendar (time)
     205             :       endif
     206             : 
     207          45 :       if (solve_zsal .or. skl_bgc .or. z_tracers) then
     208           5 :         if (tr_fsd) then
     209           0 :             write (nu_diag,*) 'FSD implementation incomplete for use with BGC'
     210           0 :             call icedrv_system_abort(string=subname,file=__FILE__,line=__LINE__)
     211             :          endif
     212           5 :          call init_bgc
     213           5 :          if (restart) call read_restart_bgc ! complete BGC initialization
     214             :       endif
     215             : 
     216             :       !-----------------------------------------------------------------
     217             :       ! aggregate tracers
     218             :       !-----------------------------------------------------------------
     219         225 :       do i = 1, nx
     220         180 :          if (tmask(i)) &
     221             :          call icepack_aggregate(ncat=ncat,          &
     222             :                                 aicen=aicen(i,:),   &
     223             :                                 vicen=vicen(i,:),   &
     224             :                                 vsnon=vsnon(i,:),   &
     225             :                                 trcrn=trcrn(i,:,:), &
     226          48 :                                 aice=aice (i),      &
     227          48 :                                 vice=vice (i),      &
     228          48 :                                 vsno=vsno (i),      &
     229             :                                 trcr=trcr (i,:),    &
     230          48 :                                 aice0=aice0(i),     &
     231             :                                 ntrcr=max_ntrcr,    &
     232             :                                 trcr_depend=trcr_depend, &
     233             :                                 trcr_base=trcr_base,     &
     234             :                                 n_trcr_strata=n_trcr_strata, &
     235         276 :                                 nt_strata=nt_strata)
     236             :       enddo
     237          45 :       call icepack_warnings_flush(nu_diag)
     238          45 :       if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
     239           0 :           file=__FILE__, line=__LINE__)
     240             : 
     241          45 :       end subroutine init_restart
     242             : 
     243             : !=======================================================================
     244             : 
     245             :       end module icedrv_InitMod
     246             : 
     247             : !=======================================================================

Generated by: LCOV version 1.14-6-g40580cd