1 | MODULE sbcice_if |
---|
2 | !!====================================================================== |
---|
3 | !! *** MODULE sbcice *** |
---|
4 | !! Surface module : update surface ocean boundary condition over ice |
---|
5 | !! covered area using ice-if model |
---|
6 | !!====================================================================== |
---|
7 | !! History : 3.0 ! 2006-06 (G. Madec) Original code |
---|
8 | !!---------------------------------------------------------------------- |
---|
9 | |
---|
10 | !!---------------------------------------------------------------------- |
---|
11 | !! sbc_ice_if : update sbc in ice-covered area |
---|
12 | !!---------------------------------------------------------------------- |
---|
13 | USE oce ! ocean dynamics and tracers |
---|
14 | USE dom_oce ! ocean space and time domain |
---|
15 | USE phycst ! physical constants |
---|
16 | USE eosbn2 ! equation of state |
---|
17 | USE sbc_oce ! surface boundary condition: ocean fields |
---|
18 | USE sbccpl |
---|
19 | USE fldread ! read input field |
---|
20 | USE iom ! I/O manager library |
---|
21 | USE in_out_manager ! I/O manager |
---|
22 | USE lib_mpp ! MPP library |
---|
23 | |
---|
24 | IMPLICIT NONE |
---|
25 | PRIVATE |
---|
26 | |
---|
27 | PUBLIC sbc_ice_if ! routine called in sbcmod |
---|
28 | |
---|
29 | TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_ice ! structure of input ice-cover (file informations, fields read) |
---|
30 | |
---|
31 | !! * Substitutions |
---|
32 | # include "domzgr_substitute.h90" |
---|
33 | !!---------------------------------------------------------------------- |
---|
34 | !! NEMO/OPA 3.3 , NEMO Consortium (2010) |
---|
35 | !! $Id$ |
---|
36 | !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) |
---|
37 | !!---------------------------------------------------------------------- |
---|
38 | CONTAINS |
---|
39 | |
---|
40 | SUBROUTINE sbc_ice_if( kt ) |
---|
41 | !!--------------------------------------------------------------------- |
---|
42 | !! *** ROUTINE sbc_ice_if *** |
---|
43 | !! |
---|
44 | !! ** Purpose : handle surface boundary condition over ice cover area |
---|
45 | !! when sea-ice model are not used |
---|
46 | !! |
---|
47 | !! ** Method : - read sea-ice cover climatology |
---|
48 | !! - blah blah blah, ... |
---|
49 | !! |
---|
50 | !! ** Action : utau, vtau : remain unchanged |
---|
51 | !! taum, wndm : remain unchanged |
---|
52 | !! qns, qsr : update heat flux below sea-ice |
---|
53 | !! emp, emps : update freshwater flux below sea-ice |
---|
54 | !! fr_i : update the ice fraction |
---|
55 | !!--------------------------------------------------------------------- |
---|
56 | INTEGER, INTENT(in) :: kt ! ocean time step |
---|
57 | ! |
---|
58 | INTEGER :: ji, jj ! dummy loop indices |
---|
59 | INTEGER :: ierror ! return error code |
---|
60 | REAL(wp) :: ztrp, zsice, zt_fzp, zfr_obs |
---|
61 | REAL(wp) :: zqri, zqrj, zqrp, zqi |
---|
62 | !! |
---|
63 | CHARACTER(len=100) :: cn_dir ! Root directory for location of ice-if files |
---|
64 | TYPE(FLD_N) :: sn_ice ! informations about the fields to be read |
---|
65 | NAMELIST/namsbc_iif/ cn_dir, sn_ice |
---|
66 | !!--------------------------------------------------------------------- |
---|
67 | ! ! ====================== ! |
---|
68 | IF( kt == nit000 ) THEN ! First call kt=nit000 ! |
---|
69 | ! ! ====================== ! |
---|
70 | ! set file information |
---|
71 | cn_dir = './' ! directory in which the model is executed |
---|
72 | ! ... default values (NB: frequency positive => hours, negative => months) |
---|
73 | ! ! file ! frequency ! variable ! time intep ! clim ! 'yearly' or ! weights ! rotation ! |
---|
74 | ! ! name ! (hours) ! name ! (T/F) ! (T/F) ! 'monthly' ! filename ! pairs ! |
---|
75 | sn_ice = FLD_N('ice_cover', -1 , 'ice_cov' , .true. , .true. , 'yearly' , '' , '' ) |
---|
76 | |
---|
77 | REWIND ( numnam ) ! ... read in namlist namiif |
---|
78 | READ ( numnam, namsbc_iif ) |
---|
79 | |
---|
80 | ALLOCATE( sf_ice(1), STAT=ierror ) |
---|
81 | IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' ) |
---|
82 | ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) ) |
---|
83 | IF( sn_ice%ln_tint ) ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) ) |
---|
84 | |
---|
85 | ! fill sf_ice with sn_ice and control print |
---|
86 | CALL fld_fill( sf_ice, (/ sn_ice /), cn_dir, 'sbc_ice_if', 'ice-if sea-ice model', 'namsbc_iif' ) |
---|
87 | ! |
---|
88 | ENDIF |
---|
89 | |
---|
90 | CALL fld_read( kt, nn_fsbc, sf_ice ) ! Read input fields and provides the |
---|
91 | ! ! input fields at the current time-step |
---|
92 | |
---|
93 | IF( MOD( kt-1, nn_fsbc) == 0 ) THEN |
---|
94 | ! |
---|
95 | ztrp = -40. ! restoring terme for temperature (w/m2/k) |
---|
96 | zsice = - 0.04 / 0.8 ! ratio of isohaline compressibility over isotherme compressibility |
---|
97 | ! ( d rho / dt ) / ( d rho / ds ) ( s = 34, t = -1.8 ) |
---|
98 | |
---|
99 | fr_i(:,:) = tfreez( sss_m ) * tmask(:,:,1) ! sea surface freezing temperature [Celcius] |
---|
100 | #if defined key_coupled |
---|
101 | a_i(:,:,1) = fr_i(:,:) |
---|
102 | #endif |
---|
103 | |
---|
104 | ! Flux and ice fraction computation |
---|
105 | !CDIR COLLAPSE |
---|
106 | DO jj = 1, jpj |
---|
107 | DO ji = 1, jpi |
---|
108 | ! |
---|
109 | zt_fzp = fr_i(ji,jj) ! freezing point temperature |
---|
110 | zfr_obs = sf_ice(1)%fnow(ji,jj,1) ! observed ice cover |
---|
111 | ! ! ocean ice fraction (0/1) from the freezing point temperature |
---|
112 | IF( sst_m(ji,jj) <= zt_fzp ) THEN ; fr_i(ji,jj) = 1.e0 |
---|
113 | ELSE ; fr_i(ji,jj) = 0.e0 |
---|
114 | ENDIF |
---|
115 | |
---|
116 | tn(ji,jj,1) = MAX( tn(ji,jj,1), zt_fzp ) ! avoid over-freezing point temperature |
---|
117 | |
---|
118 | qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj) ! solar heat flux : zero below observed ice cover |
---|
119 | |
---|
120 | ! ! non solar heat flux : add a damping term |
---|
121 | ! # ztrp*(t-(tgel-1.)) if observed ice and no opa ice (zfr_obs=1 fr_i=0) |
---|
122 | ! # ztrp*min(0,t-tgel) if observed ice and opa ice (zfr_obs=1 fr_i=1) |
---|
123 | zqri = ztrp * ( tb(ji,jj,1) - ( zt_fzp - 1.) ) |
---|
124 | zqrj = ztrp * MIN( 0., tb(ji,jj,1) - zt_fzp ) |
---|
125 | zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri & |
---|
126 | & + fr_i(ji,jj) * zqrj ) ) * tmask(ji,jj,1) |
---|
127 | |
---|
128 | ! ! non-solar heat flux |
---|
129 | ! # qns unchanged if no climatological ice (zfr_obs=0) |
---|
130 | ! # qns = zqrp if climatological ice and no opa ice (zfr_obs=1, fr_i=0) |
---|
131 | ! # qns = zqrp -2(-4) watt/m2 if climatological ice and opa ice (zfr_obs=1, fr_i=1) |
---|
132 | ! (-2=arctic, -4=antarctic) |
---|
133 | zqi = -3. + SIGN( 1.e0, ff(ji,jj) ) |
---|
134 | qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj) & |
---|
135 | & + zfr_obs * fr_i(ji,jj) * zqi ) * tmask(ji,jj,1) & |
---|
136 | & + zqrp |
---|
137 | END DO |
---|
138 | END DO |
---|
139 | ! |
---|
140 | ENDIF |
---|
141 | ! |
---|
142 | END SUBROUTINE sbc_ice_if |
---|
143 | |
---|
144 | !!====================================================================== |
---|
145 | END MODULE sbcice_if |
---|