!======================================================================= !BOP ! ! !MODULE: ice_init - parameter and variable initializations ! ! !DESCRIPTION: ! ! parameter and variable initializations ! ! !REVISION HISTORY: ! SVN:$Id: ice_init.F90 143 2008-08-08 23:08:22Z eclare $ ! ! authors Elizabeth C. Hunke and William H. Lipscomb, LANL ! C. M. Bitz, UW ! ! 2004 WHL: Block structure added ! 2006 ECH: Added namelist variables, warnings. ! Replaced old default initial ice conditions with 3.14 version. ! Converted to free source form (F90). ! ! !INTERFACE: ! module ice_init 1,4 ! ! !USES: ! use ice_kinds_mod use ice_communicate, only: my_task, master_task, lprint_stats use ice_domain_size use ice_constants ! !EOP ! implicit none save !======================================================================= contains !======================================================================= !BOP ! ! !IROUTINE: input_data - namelist variables ! ! !INTERFACE: ! subroutine input_data 1,133 ! ! !DESCRIPTION: ! ! Namelist variables, set to default values; may be altered ! at run time ! ! !REVISION HISTORY: ! ! author Elizabeth C. Hunke, LANL ! ! !USES: ! use ice_broadcast use ice_diagnostics use ice_fileunits use ice_calendar, only: year_init, istep0, histfreq, histfreq_n, & dumpfreq, dumpfreq_n, diagfreq, & npt, dt, xndt_dyn, days_per_year, write_ic use ice_restart, only: & restart, restart_dir, restart_file, pointer_file, & runid, runtype, ice_ic, resttype, restart_format, lcdf64 use ice_history_fields, only: hist_avg, & history_format, history_dir, history_file, & incond_dir, incond_file use ice_exit use ice_itd, only: kitd, kcatbound use ice_ocean, only: oceanmixed_ice use ice_flux, only: Tfrzpt, update_ocn_f use ice_forcing, only: & ycycle, fyear_init, dbug, & atm_data_type, atm_data_dir, precip_units, & atm_data_format, ocn_data_format, & sss_data_type, sst_data_type, ocn_data_dir, & oceanmixed_file, restore_sst, trestore use ice_grid, only: grid_file, kmt_file, grid_type, grid_format use ice_mechred, only: kstrength, krdg_partic, krdg_redist use ice_dyn_evp, only: ndte, kdyn, evp_damping, yield_curve use ice_shortwave, only: albicev, albicei, albsnowv, albsnowi, & shortwave, albedo_type, R_ice, R_pnd, & R_snw, dT_mlt_in, rsnw_melt_in use ice_atmo, only: atmbndy, calc_strair use ice_transport_driver, only: advection use ice_state, only: nt_Tsfc, nt_iage, nt_FY, nt_volpn, nt_aero, & tr_aero, tr_iage, tr_FY, tr_pond, & nt_alvl, nt_vlvl, tr_lvl use ice_aerosol, only: restart_aero use ice_age, only: restart_age use ice_FY, only: restart_FY use ice_lvl, only: restart_lvl use ice_meltpond, only: restart_pond use ice_therm_vertical, only: calc_Tsfc, heat_capacity use ice_restoring ! ! !INPUT/OUTPUT PARAMETERS: ! !EOP ! integer (kind=int_kind) :: & nml_error, & ! namelist i/o error flag ntr , & ! counter for number of tracers turned on ns character (len=6) :: chartmp #ifdef CCSMCOUPLED logical :: exists #endif !----------------------------------------------------------------- ! Namelist variables. !----------------------------------------------------------------- namelist /setup_nml/ & days_per_year, year_init, istep0, dt, & npt, xndt_dyn, & runtype, runid, & ice_ic, restart, & restart_dir, restart_file, restart_format, lcdf64, & pointer_file, dumpfreq, dumpfreq_n, & diagfreq, diag_type, diag_file, & print_global, print_points, latpnt, lonpnt, & dbug, histfreq, histfreq_n, hist_avg, & history_dir, history_file, history_format, & write_ic, incond_dir, incond_file, lprint_stats namelist /grid_nml/ & grid_format, grid_type, grid_file, kmt_file, & kcatbound namelist /ice_nml/ & kitd, kdyn, ndte, & evp_damping, yield_curve, & kstrength, krdg_partic, krdg_redist, advection, & heat_capacity, shortwave, albedo_type, & albicev, albicei, albsnowv, albsnowi, & R_ice, R_pnd, R_snw, & dT_mlt_in, rsnw_melt_in, & atmbndy, fyear_init, ycycle, atm_data_format,& atm_data_type, atm_data_dir, calc_strair, calc_Tsfc, & precip_units, Tfrzpt, update_ocn_f, & oceanmixed_ice, ocn_data_format, sss_data_type, sst_data_type, & ocn_data_dir, oceanmixed_file, restore_sst, trestore, & restore_ice namelist /tracer_nml/ & tr_iage, restart_age, & tr_FY, restart_FY, & tr_lvl, restart_lvl, & tr_pond, restart_pond, & tr_aero, restart_aero !MH for soot !----------------------------------------------------------------- ! default values !----------------------------------------------------------------- days_per_year = 365 ! number of days in a year year_init = 0 ! initial year istep0 = 0 ! no. of steps taken in previous integrations, ! real (dumped) or imagined (to set calendar) #ifndef CCSMCOUPLED dt = 3600.0_dbl_kind ! time step, s #endif npt = 99999 ! total number of time steps (dt) diagfreq = 24 ! how often diag output is written print_points = .false. ! if true, print point data print_global = .true. ! if true, print global diagnostic data lprint_stats = .false. ! if true, prints decomposition statistics diag_type = 'stdout' diag_file = 'ice_diag.d' histfreq(:) = 'd' ! output frequency option for different streams **** note this is only for testing - needs to get changed back' histfreq_n(:) = 1 ! output frequency of histfreq hist_avg = .true. ! if true, write time-averages (not snapshots) history_dir = ' ' ! write to executable dir for default history_file = 'iceh' ! history file name prefix history_format = 'nc' ! file format ('bin'=binary or 'nc'=netcdf) write_ic = .false. ! write out initial condition incond_dir = history_dir ! write to history dir for default incond_file = 'iceh_ic'! file prefix dumpfreq='y' ! restart frequency option dumpfreq_n = 1 ! restart frequency restart = .false. ! if true, read restart files for initialization restart_dir = ' ' ! write to executable dir for default restart_file = 'iced' ! restart file name prefix restart_format = 'nc' ! file format ('bin'=binary or 'nc'=netcdf) lcdf64 = .false. ! 64 bit offset for netCDF pointer_file = 'ice.restart_file' ice_ic = 'default' ! latitude and sst-dependent grid_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) grid_type = 'rectangular' ! define rectangular grid internally grid_file = 'unknown_grid_file' kmt_file = 'unknown_kmt_file' kitd = 1 ! type of itd conversions (0 = delta, 1 = linear) kcatbound = 1 ! category boundary formula (0 = old, 1 = new) kdyn = 1 ! type of dynamics (1 = evp) xndt_dyn = c1 ! dynamic time steps per thermodynamic time step ndte = 120 ! subcycles per dynamics timestep: ndte=dt_dyn/dte evp_damping = .false. ! if true, use damping procedure in evp dynamics yield_curve = 'ellipse' kstrength = 1 ! 1 = Rothrock 75 strength, 0 = Hibler 79 krdg_partic = 1 ! 1 = new participation, 0 = Thorndike et al 75 krdg_redist = 1 ! 1 = new redistribution, 0 = Hibler 80 advection = 'remap' ! incremental remapping transport scheme shortwave = 'default' ! or 'dEdd' (delta-Eddington) albedo_type = 'default'! or 'constant' heat_capacity = .true. ! nonzero heat capacity (F => 0-layer thermo) calc_Tsfc = .true. ! calculate surface temperature Tfrzpt = 'linear_S' ! ocean freezing temperature, 'constant'=-1.8C update_ocn_f = .false. ! include fresh water and salt fluxes for frazil R_ice = 0.00_dbl_kind ! tuning parameter for sea ice R_pnd = 0.00_dbl_kind ! tuning parameter for ponded sea ice R_snw = 0.00_dbl_kind ! tuning parameter for snow over sea ice dT_mlt_in = 1.50_dbl_kind ! melt transition (tuning) rsnw_melt_in = 1500._dbl_kind ! max snow grain radius (tuning) albicev = 0.78_dbl_kind ! visible ice albedo for h > ahmax albicei = 0.36_dbl_kind ! near-ir ice albedo for h > ahmax albsnowv = 0.98_dbl_kind ! cold snow albedo, visible albsnowi = 0.70_dbl_kind ! cold snow albedo, near IR atmbndy = 'default' ! or 'constant' fyear_init = 1900 ! first year of forcing cycle ycycle = 1 ! number of years in forcing cycle atm_data_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) atm_data_type = 'default' atm_data_dir = ' ' calc_strair = .true. ! calculate wind stress precip_units = 'mks' ! 'mm_per_month' or ! 'mm_per_sec' = 'mks' = kg/m^2 s oceanmixed_ice = .false. ! if true, use internal ocean mixed layer ocn_data_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) sss_data_type = 'default' sst_data_type = 'default' ocn_data_dir = ' ' oceanmixed_file = 'unknown_oceanmixed_file' ! ocean forcing data restore_sst = .false. ! restore sst if true trestore = 90 ! restoring timescale, days (0 instantaneous) restore_ice = .false. ! restore ice state on grid edges if true dbug = .false. ! true writes diagnostics for input forcing latpnt(1) = 90._dbl_kind ! latitude of diagnostic point 1 (deg) lonpnt(1) = 0._dbl_kind ! longitude of point 1 (deg) latpnt(2) = -65._dbl_kind ! latitude of diagnostic point 2 (deg) lonpnt(2) = -45._dbl_kind ! longitude of point 2 (deg) #ifndef CCSMCOUPLED runid = 'unknown' ! run ID, only used in CCSM runtype = 'initial' ! run type: 'initial', 'continue' #endif !----------------------------------------------------------------- ! extra tracers (no longer namelist variables set in ice_domain_size) !----------------------------------------------------------------- tr_iage = .false. ! ice age restart_age = .false. ! ice age restart filename_iage = 'none' tr_FY = .false. ! FY ice area restart_FY = .false. ! FY ice area restart filename_FY = 'none' tr_lvl = .false. ! FY ice area restart_lvl = .false. ! FY ice area restart filename_lvl = 'none' tr_pond = .false. ! explicit melt ponds restart_pond = .false. ! melt ponds restart filename_volpn = 'none' tr_aero = .false. ! aerosols MH restart_aero = .false. ! aerosol restart MH filename_aero = 'none' resttype = 'old' !----------------------------------------------------------------- ! read from input file !----------------------------------------------------------------- call get_fileunit(nu_nml) if (my_task == master_task) then open (nu_nml, file=nml_filename, status='old',iostat=nml_error) if (nml_error /= 0) then nml_error = -1 else nml_error = 1 endif do while (nml_error > 0) print*,'Reading setup_nml' read(nu_nml, nml=setup_nml,iostat=nml_error) print*,'Reading grid_nml' read(nu_nml, nml=grid_nml,iostat=nml_error) print*,'Reading ice_nml' read(nu_nml, nml=ice_nml,iostat=nml_error) print*,'Reading tracer_nml' read(nu_nml, nml=tracer_nml,iostat=nml_error) if (nml_error > 0) read(nu_nml,*) ! for Nagware compiler end do if (nml_error == 0) close(nu_nml) endif call broadcast_scalar(nml_error, master_task) if (nml_error /= 0) then call abort_ice('ice: error reading namelist') endif call release_fileunit(nu_nml) ! Need to broadcast ice_ic at this point. call broadcast_scalar(ice_ic, master_task) !----------------------------------------------------------------- ! set up diagnostics output and resolve conflicts !----------------------------------------------------------------- #ifdef CCSMCOUPLED ! Note that diag_file is not utilized in CCSMCOUPLED mode if (my_task == master_task) then inquire(file='ice_modelio.nml',exist=exists) if (exists) then nu_diag = shr_file_getUnit() call shr_file_setIO('ice_modelio.nml',nu_diag) end if ! Note in CCSMCOUPLED mode the runid and runtype flag are obtained from ! the sequential driver - not from the cice namelist history_file = trim(runid) // ".cice.h" restart_file = trim(runid) // ".cice.r" incond_file = trim(runid) // ".cice.i." end if if (trim(ice_ic) /= 'default' .and. trim(ice_ic) /= 'none') & restart = .true. #else if (trim(diag_type) == 'file') call get_fileunit(nu_diag) #endif if (my_task == master_task) then if (trim(diag_type) == 'file') then write(ice_stdout,*) 'Diagnostic output will be in file ',diag_file open (nu_diag, file=diag_file, status='unknown') endif write(nu_diag,*) '--------------------------------' write(nu_diag,*) ' CICE model diagnostic output ' write(nu_diag,*) '--------------------------------' write(nu_diag,*) ' ' endif if (runtype == 'continue') restart = .true. if (runtype /= 'continue' .and. (restart)) then if (ice_ic == 'none' .or. ice_ic == 'default') then if (my_task == master_task) then write(nu_diag,*) & 'WARNING: runtype, restart, ice_ic are inconsistent:' write(nu_diag,*) runtype, restart, ice_ic write(nu_diag,*) & 'WARNING: Need ice_ic = <filename>.' write(nu_diag,*) & 'WARNING: Initializing using ice_ic conditions' endif restart = .false. endif endif if (runtype == 'initial' .and. .not.(restart)) then if (ice_ic /= 'none' .and. ice_ic /= 'default') then if (my_task == master_task) then write(nu_diag,*) & 'WARNING: runtype, restart, ice_ic are inconsistent:' write(nu_diag,*) runtype, restart, ice_ic write(nu_diag,*) & 'WARNING: Initializing with NO ICE: ' endif ice_ic = 'none' endif endif #ifndef ncdf ! netcdf is unavailable history_format = 'bin' restart_format = 'bin' grid_format = 'bin' atm_data_format = 'bin' ocn_data_format = 'bin' #endif if (days_per_year /= 365) shortwave = 'default' ! definite conflict chartmp = advection(1:6) if (chartmp /= 'upwind' .and. chartmp /= 'remap ') advection = 'remap' if (ncat == 1 .and. kitd == 1) then write (nu_diag,*) 'Remapping the ITD is not allowed for ncat=1' write (nu_diag,*) 'Using the delta function ITD option instead' kitd = 0 endif if (trim(atm_data_type) == 'monthly' .and. calc_strair) & calc_strair = .false. if (trim(atm_data_type) == 'hadgem' .and. & trim(precip_units) /= 'mks') then if (my_task == master_task) & write (nu_diag,*) & 'WARNING: HadGEM atmospheric data chosen with wrong precip_units' write (nu_diag,*) & 'WARNING: Changing precip_units to mks (i.e. kg/m2 s).' precip_units='mks' endif call broadcast_scalar(days_per_year, master_task) call broadcast_scalar(year_init, master_task) call broadcast_scalar(istep0, master_task) call broadcast_scalar(dt, master_task) call broadcast_scalar(npt, master_task) call broadcast_scalar(diagfreq, master_task) call broadcast_scalar(print_points, master_task) call broadcast_scalar(print_global, master_task) call broadcast_scalar(diag_type, master_task) call broadcast_scalar(diag_file, master_task) call broadcast_scalar(history_format, master_task) ! call broadcast_scalar(histfreq, master_task) ! call broadcast_scalar(histfreq_n, master_task) do ns=1,max_nstrm call broadcast_scalar(histfreq(ns), master_task) call broadcast_scalar(histfreq_n(ns), master_task) enddo ! call broadcast_array(histfreq_n(:), master_task) call broadcast_scalar(hist_avg, master_task) call broadcast_scalar(history_dir, master_task) call broadcast_scalar(history_file, master_task) call broadcast_scalar(write_ic, master_task) call broadcast_scalar(incond_dir, master_task) call broadcast_scalar(incond_file, master_task) call broadcast_scalar(dumpfreq, master_task) call broadcast_scalar(dumpfreq_n, master_task) call broadcast_scalar(restart_file, master_task) call broadcast_scalar(restart, master_task) call broadcast_scalar(restart_dir, master_task) call broadcast_scalar(restart_format, master_task) call broadcast_scalar(lcdf64, master_task) call broadcast_scalar(pointer_file, master_task) call broadcast_scalar(grid_format, master_task) call broadcast_scalar(grid_type, master_task) call broadcast_scalar(grid_file, master_task) call broadcast_scalar(kmt_file, master_task) call broadcast_scalar(kitd, master_task) call broadcast_scalar(kcatbound, master_task) call broadcast_scalar(kdyn, master_task) call broadcast_scalar(xndt_dyn, master_task) call broadcast_scalar(ndte, master_task) call broadcast_scalar(evp_damping, master_task) call broadcast_scalar(yield_curve, master_task) call broadcast_scalar(kstrength, master_task) call broadcast_scalar(krdg_partic, master_task) call broadcast_scalar(krdg_redist, master_task) call broadcast_scalar(advection, master_task) call broadcast_scalar(shortwave, master_task) call broadcast_scalar(albedo_type, master_task) call broadcast_scalar(heat_capacity, master_task) call broadcast_scalar(R_ice, master_task) call broadcast_scalar(R_pnd, master_task) call broadcast_scalar(R_snw, master_task) call broadcast_scalar(dT_mlt_in, master_task) call broadcast_scalar(rsnw_melt_in, master_task) call broadcast_scalar(albicev, master_task) call broadcast_scalar(albicei, master_task) call broadcast_scalar(albsnowv, master_task) call broadcast_scalar(albsnowi, master_task) call broadcast_scalar(atmbndy, master_task) call broadcast_scalar(fyear_init, master_task) call broadcast_scalar(ycycle, master_task) call broadcast_scalar(atm_data_format, master_task) call broadcast_scalar(atm_data_type, master_task) call broadcast_scalar(atm_data_dir, master_task) call broadcast_scalar(calc_strair, master_task) call broadcast_scalar(calc_Tsfc, master_task) call broadcast_scalar(Tfrzpt, master_task) call broadcast_scalar(update_ocn_f, master_task) call broadcast_scalar(precip_units, master_task) call broadcast_scalar(oceanmixed_ice, master_task) call broadcast_scalar(ocn_data_format, master_task) call broadcast_scalar(sss_data_type, master_task) call broadcast_scalar(sst_data_type, master_task) call broadcast_scalar(ocn_data_dir, master_task) call broadcast_scalar(oceanmixed_file, master_task) call broadcast_scalar(restore_sst, master_task) call broadcast_scalar(trestore, master_task) call broadcast_scalar(restore_ice, master_task) call broadcast_scalar(dbug, master_task) call broadcast_array (latpnt(1:2), master_task) call broadcast_array (lonpnt(1:2), master_task) call broadcast_scalar(runid, master_task) call broadcast_scalar(runtype, master_task) if (dbug) & ! else only master_task writes to file call broadcast_scalar(nu_diag, master_task) ! tracers call broadcast_scalar(tr_iage, master_task) call broadcast_scalar(restart_age, master_task) call broadcast_scalar(tr_FY, master_task) call broadcast_scalar(restart_FY, master_task) call broadcast_scalar(tr_lvl, master_task) call broadcast_scalar(restart_lvl, master_task) call broadcast_scalar(tr_pond, master_task) call broadcast_scalar(restart_pond, master_task) call broadcast_scalar(tr_aero, master_task) call broadcast_scalar(restart_aero, master_task) !----------------------------------------------------------------- ! spew !----------------------------------------------------------------- if (my_task == master_task) then write(nu_diag,*) ' Document ice_in namelist parameters:' write(nu_diag,*) ' ==================================== ' write(nu_diag,*) ' ' if (trim(runid) /= 'unknown') & write(nu_diag,*) ' runid = ', & trim(runid) write(nu_diag,1030) ' runtype = ', & trim(runtype) write(nu_diag,1020) ' days_per_year = ', days_per_year write(nu_diag,1020) ' year_init = ', year_init write(nu_diag,1020) ' istep0 = ', istep0 write(nu_diag,1000) ' dt = ', dt write(nu_diag,1020) ' npt = ', npt write(nu_diag,1020) ' diagfreq = ', diagfreq write(nu_diag,1010) ' print_global = ', & print_global write(nu_diag,1010) ' print_points = ', & print_points write(nu_diag,1050) ' histfreq = ', histfreq(:) write(nu_diag,1040) ' histfreq_n = ', histfreq_n(:) write(nu_diag,1010) ' hist_avg = ', hist_avg if (hist_avg) then write (nu_diag,*) 'History data will be averaged over ', & histfreq_n,' ',histfreq else write (nu_diag,*) 'History data will be snapshots' endif write(nu_diag,*) ' history_dir = ', & trim(history_dir) write(nu_diag,*) ' history_file = ', & trim(history_file) write(nu_diag,*) ' history_format = ', & trim(history_format) if (write_ic) then write (nu_diag,*) 'Initial condition will be written in ', & trim(incond_dir) endif write(nu_diag,1030) ' dumpfreq = ', & trim(dumpfreq) write(nu_diag,1020) ' dumpfreq_n = ', dumpfreq_n write(nu_diag,1010) ' restart = ', restart write(nu_diag,*) ' restart_dir = ', & trim(restart_dir) write(nu_diag,*) ' restart_file = ', & trim(restart_file) write(nu_diag,*) ' restart_format = ', & trim(restart_format) write(nu_diag,*) ' lcdf64 = ', & lcdf64 write(nu_diag,*) ' pointer_file = ', & trim(pointer_file) write(nu_diag,* ) ' ice_ic = ', & trim(ice_ic) write(nu_diag,*) ' grid_type = ', & trim(grid_type) if (trim(grid_type) /= 'rectangular' .or. & trim(grid_type) /= 'column') then write(nu_diag,*) ' grid_file = ', & trim(grid_file) write(nu_diag,*) ' kmt_file = ', & trim(kmt_file) endif write(nu_diag,1020) ' kitd = ', kitd write(nu_diag,1020) ' kcatbound = ', & kcatbound write(nu_diag,1020) ' kdyn = ', kdyn write(nu_diag,1000) ' xndt_dyn = ', xndt_dyn write(nu_diag,1020) ' ndte = ', ndte write(nu_diag,1010) ' evp_damping = ', & evp_damping write(nu_diag,*) ' yield_curve = ', & trim(yield_curve) write(nu_diag,1020) ' kstrength = ', kstrength write(nu_diag,1020) ' krdg_partic = ', & krdg_partic write(nu_diag,1020) ' krdg_redist = ', & krdg_redist write(nu_diag,1030) ' advection = ', & trim(advection) write(nu_diag,1030) ' shortwave = ', & trim(shortwave) write(nu_diag,1030) ' albedo_type = ', & trim(albedo_type) write(nu_diag,1000) ' R_ice = ', R_ice write(nu_diag,1000) ' R_pnd = ', R_pnd write(nu_diag,1000) ' R_snw = ', R_snw write(nu_diag,1000) ' dT_mlt_in = ', dT_mlt_in write(nu_diag,1000) ' rsnw_melt_in = ', rsnw_melt_in write(nu_diag,1000) ' albicev = ', albicev write(nu_diag,1000) ' albicei = ', albicei write(nu_diag,1000) ' albsnowv = ', albsnowv write(nu_diag,1000) ' albsnowi = ', albsnowi write(nu_diag,1010) ' heat_capacity = ', & heat_capacity write(nu_diag,1030) ' atmbndy = ', & trim(atmbndy) write(nu_diag,1020) ' fyear_init = ', & fyear_init write(nu_diag,1020) ' ycycle = ', ycycle write(nu_diag,*) ' atm_data_type = ', & trim(atm_data_type) write(nu_diag,1010) ' calc_strair = ', calc_strair write(nu_diag,1010) ' calc_Tsfc = ', calc_Tsfc write(nu_diag,*) ' Tfrzpt = ', trim(Tfrzpt) write(nu_diag,1010) ' update_ocn_f = ', update_ocn_f if (trim(atm_data_type) /= 'default') then write(nu_diag,*) ' atm_data_dir = ', & trim(atm_data_dir) write(nu_diag,*) ' precip_units = ', & trim(precip_units) endif write(nu_diag,1010) ' oceanmixed_ice = ', & oceanmixed_ice write(nu_diag,*) ' sss_data_type = ', & trim(sss_data_type) write(nu_diag,*) ' sst_data_type = ', & trim(sst_data_type) if (trim(sss_data_type) /= 'default' .or. & trim(sst_data_type) /= 'default') then write(nu_diag,*) ' ocn_data_dir = ', & trim(ocn_data_dir) endif if (trim(sss_data_type) == 'ncar' .or. & trim(sst_data_type) == 'ncar') then write(nu_diag,*) ' oceanmixed_file = ', & trim(oceanmixed_file) endif #ifdef coupled if( oceanmixed_ice ) then write (nu_diag,*) 'WARNING WARNING WARNING WARNING ' write (nu_diag,*) '*Coupled and oceanmixed flags are *' write (nu_diag,*) '*BOTH ON. Ocean data received from*' write (nu_diag,*) '*coupler will be altered by mixed *' write (nu_diag,*) '*layer routine! *' write (nu_diag,*) ' ' endif #endif write (nu_diag,*) ' ' write (nu_diag,'(a30,2f8.2)') 'Diagnostic point 1: lat, lon =', & latpnt(1), lonpnt(1) write (nu_diag,'(a30,2f8.2)') 'Diagnostic point 2: lat, lon =', & latpnt(2), lonpnt(2) ! tracers write(nu_diag,1010) ' tr_iage = ', tr_iage write(nu_diag,1010) ' restart_age = ', restart_age write(nu_diag,1010) ' tr_FY = ', tr_FY write(nu_diag,1010) ' restart_FY = ', restart_FY write(nu_diag,1010) ' tr_lvl = ', tr_lvl write(nu_diag,1010) ' restart_lvl = ', restart_lvl write(nu_diag,1010) ' tr_pond = ', tr_pond write(nu_diag,1010) ' restart_pond = ', restart_pond write(nu_diag,1010) ' tr_aero = ', tr_aero !MH write(nu_diag,1010) ' restart_aero = ', restart_aero !MH nt_Tsfc = 1 ! index tracers, starting with Tsfc = 1 ntrcr = 1 ! count tracers, starting with Tsfc = 1 if (tr_iage) then nt_iage = ntrcr + 1 ntrcr = ntrcr + 1 else nt_iage = max_ntrcr endif if (tr_FY) then nt_FY = ntrcr + 1 ntrcr = ntrcr + 1 else nt_FY = max_ntrcr endif if (tr_lvl) then nt_alvl = ntrcr + 1 ntrcr = ntrcr + 1 nt_vlvl = ntrcr + 1 ntrcr = ntrcr + 1 else nt_alvl = max_ntrcr nt_vlvl = max_ntrcr endif if (tr_pond) then nt_volpn = ntrcr + 1 ntrcr = ntrcr + 1 else nt_volpn = max_ntrcr endif if (tr_aero) then nt_aero = ntrcr + 1 ntrcr = ntrcr + n_aero*4 !MH 2 for snow soot and 2 for ice !MH for multiple (n_aero) aerosols else nt_aero = max_ntrcr endif if (ntrcr > max_ntrcr) then write(nu_diag,*) 'max_ntrcr < number of namelist tracers' call abort_ice('max_ntrcr < number of namelist tracers') endif 1000 format (a30,2x,f9.2) ! a30 to align formatted, unformatted statements 1010 format (a30,2x,l6) ! logical 1020 format (a30,2x,i6) ! integer 1030 format (a30, a8) ! character 1040 format (a30,2x,6i6) ! integer 1050 format (a30, 6a8) ! character write (nu_diag,*) ' ' if (grid_type /= 'displaced_pole' .and. & grid_type /= 'tripole' .and. & grid_type /= 'column' .and. & grid_type /= 'rectangular' .and. & grid_type /= 'panarctic' .and. & grid_type /= 'latlon' ) then call abort_ice('ice_init: unknown grid_type') endif endif ! my_task = master_task call broadcast_scalar(ntrcr, master_task) call broadcast_scalar(nt_Tsfc, master_task) call broadcast_scalar(nt_iage, master_task) call broadcast_scalar(nt_FY, master_task) call broadcast_scalar(nt_alvl, master_task) call broadcast_scalar(nt_vlvl, master_task) call broadcast_scalar(nt_volpn, master_task) call broadcast_scalar(nt_aero, master_task) end subroutine input_data !======================================================================= !BOP ! ! !IROUTINE: init_state - initialize ice state variables ! ! !INTERFACE: ! subroutine init_state 2,35 ! ! !DESCRIPTION: ! ! Initialize state for the itd model ! ! !REVISION HISTORY: ! ! authors: C. M. Bitz, UW ! William H. Lipscomb, LANL ! ! !USES: ! use ice_blocks use ice_domain use ice_flux, only: sst, Tf, Tair use ice_grid use ice_state use ice_itd use ice_exit use ice_therm_vertical, only: heat_capacity ! ! !INPUT/OUTPUT PARAMETERS: ! !EOP ! integer (kind=int_kind) :: & i, j , & ! horizontal indices it, n , & ! tracer index iblk ! block index !----------------------------------------------------------------- ! Check number of layers in ice and snow. !----------------------------------------------------------------- if (my_task == master_task) then if (nilyr < 1) then write (nu_diag,*) 'nilyr =', nilyr write (nu_diag,*) 'Must have at least one ice layer' call abort_ice ('ice_init: Not enough ice layers') endif if (nslyr < 1) then write (nu_diag,*) 'nslyr =', nslyr write (nu_diag,*) 'Must have at least one snow layer' call abort_ice('ice_init: Not enough snow layers') endif if (.not.heat_capacity) then write (nu_diag,*) 'WARNING - Zero-layer thermodynamics' if (nilyr > 1) then write (nu_diag,*) 'nilyr =', nilyr write (nu_diag,*) & 'Must have nilyr = 1 if heat_capacity = F' call abort_ice('ice_init: Too many ice layers') endif if (nslyr > 1) then write (nu_diag,*) 'nslyr =', nslyr write (nu_diag,*) & 'Must have nslyr = 1 if heat_capacity = F' call abort_ice('ice_init: Too many snow layers') endif endif ! heat_capacity = F endif ! my_task !----------------------------------------------------------------- ! Set tracer types !----------------------------------------------------------------- trcr_depend(nt_Tsfc) = 0 ! ice/snow surface temperature if (tr_iage) trcr_depend(nt_iage) = 1 ! volume-weighted ice age if (tr_FY) trcr_depend(nt_FY) = 0 ! area-weighted FY conc if (tr_lvl) trcr_depend(nt_alvl) = 0 ! level ice area if (tr_lvl) trcr_depend(nt_vlvl) = 1 ! level ice volume if (tr_pond) trcr_depend(nt_volpn) = 0 ! melt pond volume if (tr_aero) then do n=1,n_aero trcr_depend(nt_aero+(n-1)*4 :nt_aero+(n-1)*4+1) = 2 ! snow volume-weighted MH trcr_depend(nt_aero+(n-1)*4+2:nt_aero+(n-1)*4+3) = 1 ! volume-weighted MH enddo endif !$OMP PARALLEL DO PRIVATE(iblk,it) do iblk = 1, nblocks !----------------------------------------------------------------- ! Set state variables !----------------------------------------------------------------- call set_state_var (nx_block, ny_block, & tmask(:,:, iblk), & ULON (:,:, iblk), ULAT (:,:, iblk), & Tair (:,:, iblk), sst (:,:, iblk), & Tf (:,:, iblk), trcr_depend, & aicen(:,:, :,iblk), trcrn(:,:,:,:,iblk), & vicen(:,:, :,iblk), vsnon(:,:, :,iblk), & eicen(:,:, :,iblk), esnon(:,:, :,iblk)) !----------------------------------------------------------------- ! compute aggregate ice state and open water area !----------------------------------------------------------------- aice(:,:,iblk) = c0 vice(:,:,iblk) = c0 vsno(:,:,iblk) = c0 eice(:,:,iblk) = c0 esno(:,:,iblk) = c0 do it = 1, max_ntrcr trcr(:,:,it,iblk) = c0 enddo call aggregate (nx_block, ny_block, & aicen(:,:,:,iblk), & trcrn(:,:,:,:,iblk), & vicen(:,:,:,iblk), & vsnon(:,:,:,iblk), & eicen(:,:,:,iblk), & esnon(:,:,:,iblk), & aice (:,:, iblk), & trcr (:,:,:,iblk), & vice (:,:, iblk), & vsno (:,:, iblk), & eice (:,:, iblk), & esno (:,:, iblk), & aice0(:,:, iblk), & tmask(:,:, iblk), & ntrcr, & trcr_depend) aice_init(:,:,iblk) = aice(:,:,iblk) enddo ! iblk !$OMP END PARALLEL DO !----------------------------------------------------------------- ! ghost cell updates !----------------------------------------------------------------- call bound_state (aicen, trcrn, & vicen, vsnon, & eicen, esnon) end subroutine init_state !======================================================================= !BOP ! ! !IROUTINE: set_state_var - initialize single-category state variables ! ! !INTERFACE: ! subroutine set_state_var (nx_block, ny_block, & 1,5 tmask, ULON, ULAT, & Tair, sst, & Tf, trcr_depend, & aicen, trcrn, & vicen, vsnon, & eicen, esnon) ! ! !DESCRIPTION: ! ! Initialize state in each ice thickness category ! ! !REVISION HISTORY: ! ! authors: C. M. Bitz ! William H. Lipscomb, LANL ! ! !USES: ! use ice_state, only: nt_Tsfc use ice_therm_vertical, only: heat_capacity, calc_Tsfc, Tmlt use ice_itd, only: ilyr1, slyr1, hin_max use ice_grid, only: grid_type use ice_restart, only: ice_ic ! ! !INPUT/OUTPUT PARAMETERS: ! integer (kind=int_kind), intent(in) :: & nx_block, ny_block ! block dimensions logical (kind=log_kind), dimension (nx_block,ny_block), & intent(in) :: & tmask ! true for ice/ocean cells real (kind=dbl_kind), dimension (nx_block,ny_block), & intent(in) :: & ULON , & ! latitude of velocity pts (radians) ULAT ! latitude of velocity pts (radians) real (kind=dbl_kind), dimension (nx_block,ny_block), intent(in) :: & Tair , & ! air temperature (K) Tf , & ! freezing temperature (C) sst ! sea surface temperature (C) integer (kind=int_kind), dimension (max_ntrcr), intent(inout) :: & trcr_depend ! = 0 for aicen tracers, 1 for vicen, 2 for vsnon real (kind=dbl_kind), dimension (nx_block,ny_block,ncat), & intent(out) :: & aicen , & ! concentration of ice vicen , & ! volume per unit area of ice (m) vsnon ! volume per unit area of snow (m) real (kind=dbl_kind), dimension (nx_block,ny_block,max_ntrcr,ncat), & intent(out) :: & trcrn ! ice tracers ! 1: surface temperature of ice/snow (C) real (kind=dbl_kind), dimension (nx_block,ny_block,ntilyr), & intent(out) :: & eicen ! energy of melting for each ice layer (J/m^2) real (kind=dbl_kind), dimension (nx_block,ny_block,ntslyr), & intent(out) :: & esnon ! energy of melting for each ice layer (J/m^2) ! !EOP ! integer (kind=int_kind) :: & i, j , & ! horizontal indices ij , & ! horizontal index, combines i and j loops k , & ! ice layer index n , & ! thickness category index it , & ! tracer index icells ! number of cells initialized with ice integer (kind=int_kind), dimension(nx_block*ny_block) :: & indxi, indxj ! compressed indices for cells with aicen > puny real (kind=dbl_kind) :: & slope, Ti, sum, hbar, & ainit(ncat), & hinit(ncat) real (kind=dbl_kind), parameter :: & hsno_init = 0.20_dbl_kind , & ! initial snow thickness (m) edge_init_nh = 70._dbl_kind, & ! initial ice edge, N.Hem. (deg) edge_init_sh = -60._dbl_kind ! initial ice edge, S.Hem. (deg) indxi(:) = 0 indxj(:) = 0 ! Initialize state variables. ! If restarting, these values are overwritten. do n = 1, ncat do j = 1, ny_block do i = 1, nx_block aicen(i,j,n) = c0 vicen(i,j,n) = c0 vsnon(i,j,n) = c0 trcrn(i,j,nt_Tsfc,n) = Tf(i,j) ! surface temperature if (max_ntrcr >= 2) then do it = 2, max_ntrcr trcrn(i,j,it,n) = c0 enddo endif enddo enddo enddo eicen(:,:,:) = c0 esnon(:,:,:) = c0 if (trim(ice_ic) == 'default') then !----------------------------------------------------------------- ! Place ice where ocean surface is cold. ! Note: If SST is not read from a file, then the ocean is assumed ! to be at its freezing point everywhere, and ice will ! extend to the prescribed edges. !----------------------------------------------------------------- ! initial category areas in cells with ice hbar = c3 ! initial ice thickness with greatest area ! Note: the resulting average ice thickness ! tends to be less than hbar due to the ! nonlinear distribution of ice thicknesses sum = c0 do n = 1, ncat if (n < ncat) then hinit(n) = p5*(hin_max(n-1) + hin_max(n)) ! m else ! n=ncat hinit(n) = (hin_max(n-1) + c1) ! m endif ! parabola, max at h=hbar, zero at h=0, 2*hbar ainit(n) = max(c0, (c2*hbar*hinit(n) - hinit(n)**2)) sum = sum + ainit(n) enddo do n = 1, ncat ainit(n) = ainit(n) / (sum + puny/ncat) ! normalize enddo if (trim(grid_type) == 'rectangular') then ! place ice on left side of domain icells = 0 do j = 1, ny_block do i = 1, nx_block if (tmask(i,j)) then if (ULON(i,j) < -50./rad_to_deg) then icells = icells + 1 indxi(icells) = i indxj(icells) = j endif ! ULON endif ! tmask enddo ! i enddo ! j else ! place ice at high latitudes where ocean sfc is cold icells = 0 do j = 1, ny_block do i = 1, nx_block if (tmask(i,j)) then ! place ice in high latitudes where ocean sfc is cold if ( (sst (i,j) <= Tf(i,j)+p2) .and. & (ULAT(i,j) < edge_init_sh/rad_to_deg .or. & ULAT(i,j) > edge_init_nh/rad_to_deg) ) then icells = icells + 1 indxi(icells) = i indxj(icells) = j endif ! cold surface endif ! tmask enddo ! i enddo ! j endif ! rectgrid do n = 1, ncat ! ice volume, snow volume !DIR$ CONCURRENT !Cray !cdir nodep !NEC !ocl novrec !Fujitsu do ij = 1, icells i = indxi(ij) j = indxj(ij) aicen(i,j,n) = ainit(n) vicen(i,j,n) = hinit(n) * ainit(n) ! m vsnon(i,j,n) =min(aicen(i,j,n)*hsno_init,p2*vicen(i,j,n)) enddo ! ij ! surface temperature if (calc_Tsfc) then do ij = 1, icells i = indxi(ij) j = indxj(ij) trcrn(i,j,nt_Tsfc,n) = min(Tsmelt, Tair(i,j) - Tffresh) !deg C enddo else ! Tsfc is not calculated by the ice model do ij = 1, icells i = indxi(ij) j = indxj(ij) trcrn(i,j,nt_Tsfc,n) = Tf(i,j) ! not used enddo endif ! calc_Tsfc ! other tracers (none at present) if (heat_capacity) then ! ice energy do k = 1, nilyr do ij = 1, icells i = indxi(ij) j = indxj(ij) ! assume linear temp profile and compute enthalpy slope = Tf(i,j) - trcrn(i,j,nt_Tsfc,n) Ti = trcrn(i,j,nt_Tsfc,n) & + slope*(real(k,kind=dbl_kind)-p5) & /real(nilyr,kind=dbl_kind) eicen(i,j,ilyr1(n)+k-1) = & -(rhoi * (cp_ice*(Tmlt(k)-Ti) & + Lfresh*(c1-Tmlt(k)/Ti) - cp_ocn*Tmlt(k))) & * vicen(i,j,n)/real(nilyr,kind=dbl_kind) enddo ! ij enddo ! nilyr ! snow energy do k = 1, nslyr do ij = 1, icells i = indxi(ij) j = indxj(ij) Ti = min(c0, trcrn(i,j,nt_Tsfc,n)) esnon(i,j,slyr1(n)+k-1) = -rhos*(Lfresh - cp_ice*Ti) & *vsnon(i,j,n) & /real(nslyr,kind=dbl_kind) enddo ! ij enddo ! nslyr else ! one layer with zero heat capacity ! ice energy k = 1 do ij = 1, icells i = indxi(ij) j = indxj(ij) eicen(i,j,ilyr1(n)+k-1) = & - rhoi * Lfresh * vicen(i,j,n) enddo ! ij ! snow energy do ij = 1, icells i = indxi(ij) j = indxj(ij) esnon(i,j,slyr1(n)+k-1) = & - rhos * Lfresh * vsnon(i,j,n) enddo ! ij endif ! heat_capacity enddo ! ncat endif ! ice_ic end subroutine set_state_var !======================================================================= end module ice_init !=======================================================================