89 type(surface),
intent(inout) :: state
90 type(forcing),
intent(inout) :: fluxes
91 type(time_type),
intent(in) :: day
92 real,
intent(in) :: dt
94 type(ocean_grid_type),
intent(in) :: g
95 type(bfb_surface_forcing_cs),
pointer :: cs
123 real :: salin_restore
124 real :: density_restore
127 real :: buoy_rest_const
129 integer :: i, j, is, ie, js, je
130 integer :: isd, ied, jsd, jed
132 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
133 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
142 if (cs%use_temperature)
then 143 call alloc_if_needed(fluxes%evap, isd, ied, jsd, jed)
144 call alloc_if_needed(fluxes%lprec, isd, ied, jsd, jed)
145 call alloc_if_needed(fluxes%fprec, isd, ied, jsd, jed)
146 call alloc_if_needed(fluxes%lrunoff, isd, ied, jsd, jed)
147 call alloc_if_needed(fluxes%frunoff, isd, ied, jsd, jed)
148 call alloc_if_needed(fluxes%vprec, isd, ied, jsd, jed)
150 call alloc_if_needed(fluxes%sw, isd, ied, jsd, jed)
151 call alloc_if_needed(fluxes%lw, isd, ied, jsd, jed)
152 call alloc_if_needed(fluxes%latent, isd, ied, jsd, jed)
153 call alloc_if_needed(fluxes%sens, isd, ied, jsd, jed)
155 call alloc_if_needed(fluxes%buoy, isd, ied, jsd, jed)
161 if ( cs%use_temperature )
then 164 do j=js,je ;
do i=is,ie
167 fluxes%evap(i,j) = -0.0 * g%mask2dT(i,j)
168 fluxes%lprec(i,j) = 0.0 * g%mask2dT(i,j)
171 fluxes%vprec(i,j) = 0.0
174 fluxes%lw(i,j) = 0.0 * g%mask2dT(i,j)
175 fluxes%latent(i,j) = 0.0 * g%mask2dT(i,j)
176 fluxes%sens(i,j) = 0.0 * g%mask2dT(i,j)
177 fluxes%sw(i,j) = 0.0 * g%mask2dT(i,j)
180 do j=js,je ;
do i=is,ie
183 fluxes%buoy(i,j) = 0.0 * g%mask2dT(i,j)
187 if (cs%restorebuoy)
then 188 if (cs%use_temperature)
then 189 call alloc_if_needed(fluxes%heat_added, isd, ied, jsd, jed)
192 call mom_error(fatal,
"User_buoyancy_surface_forcing: " // &
193 "Temperature and salinity restoring used without modification." )
195 rhoxcp = cs%Rho0 * fluxes%C_p
196 do j=js,je ;
do i=is,ie
202 fluxes%heat_added(i,j) = (g%mask2dT(i,j) * (rhoxcp * cs%Flux_const)) * &
203 (temp_restore - state%SST(i,j))
204 fluxes%vprec(i,j) = - (g%mask2dT(i,j) * (cs%Rho0*cs%Flux_const)) * &
205 ((salin_restore - state%SSS(i,j)) / &
206 (0.5 * (salin_restore + state%SSS(i,j))))
215 buoy_rest_const = -1.0 * (cs%G_Earth * cs%Flux_const) / cs%Rho0
217 do j=js,je ;
do i=is,ie
220 if (g%geoLatT(i,j) < cs%lfrslat)
then 221 temp_restore = cs%SST_s
222 else if (g%geoLatT(i,j) > cs%lfrnlat)
then 223 temp_restore = cs%SST_n
225 temp_restore = (cs%SST_s - cs%SST_n)/(cs%lfrslat - cs%lfrnlat) * &
226 (g%geoLatT(i,j) - cs%lfrslat) + cs%SST_s
229 density_restore = temp_restore*cs%drho_dt + cs%Rho0
231 fluxes%buoy(i,j) = g%mask2dT(i,j) * buoy_rest_const * &
232 (density_restore - state%sfc_density(i,j))