166 type(surface),
intent(inout) :: state
167 type(forcing),
intent(inout) :: fluxes
168 type(time_type),
intent(in) :: day
169 real,
intent(in) :: dt
172 type(user_surface_forcing_cs),
pointer :: cs
200 real :: salin_restore
201 real :: density_restore
204 real :: buoy_rest_const
207 integer :: i, j, is, ie, js, je
208 integer :: isd, ied, jsd, jed
210 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
211 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
215 call mom_error(fatal,
"User_buoyancy_surface_forcing: " // &
216 "User forcing routine called without modification." )
220 if (cs%use_temperature)
then 221 call alloc_if_needed(fluxes%evap, isd, ied, jsd, jed)
222 call alloc_if_needed(fluxes%lprec, isd, ied, jsd, jed)
223 call alloc_if_needed(fluxes%fprec, isd, ied, jsd, jed)
224 call alloc_if_needed(fluxes%lrunoff, isd, ied, jsd, jed)
225 call alloc_if_needed(fluxes%frunoff, isd, ied, jsd, jed)
226 call alloc_if_needed(fluxes%vprec, isd, ied, jsd, jed)
228 call alloc_if_needed(fluxes%sw, isd, ied, jsd, jed)
229 call alloc_if_needed(fluxes%lw, isd, ied, jsd, jed)
230 call alloc_if_needed(fluxes%latent, isd, ied, jsd, jed)
231 call alloc_if_needed(fluxes%sens, isd, ied, jsd, jed)
233 call alloc_if_needed(fluxes%buoy, isd, ied, jsd, jed)
239 if ( cs%use_temperature )
then 242 do j=js,je ;
do i=is,ie
245 fluxes%evap(i,j) = -0.0 * g%mask2dT(i,j)
246 fluxes%lprec(i,j) = 0.0 * g%mask2dT(i,j)
249 fluxes%vprec(i,j) = 0.0
252 fluxes%lw(i,j) = 0.0 * g%mask2dT(i,j)
253 fluxes%latent(i,j) = 0.0 * g%mask2dT(i,j)
254 fluxes%sens(i,j) = 0.0 * g%mask2dT(i,j)
255 fluxes%sw(i,j) = 0.0 * g%mask2dT(i,j)
258 do j=js,je ;
do i=is,ie
261 fluxes%buoy(i,j) = 0.0 * g%mask2dT(i,j)
265 if (cs%restorebuoy)
then 266 if (cs%use_temperature)
then 267 call alloc_if_needed(fluxes%heat_added, isd, ied, jsd, jed)
270 call mom_error(fatal,
"User_buoyancy_surface_forcing: " // &
271 "Temperature and salinity restoring used without modification." )
273 rhoxcp = cs%Rho0 * fluxes%C_p
274 do j=js,je ;
do i=is,ie
280 fluxes%heat_added(i,j) = (g%mask2dT(i,j) * (rhoxcp * cs%Flux_const)) * &
281 (temp_restore - state%SST(i,j))
282 fluxes%vprec(i,j) = - (g%mask2dT(i,j) * (cs%Rho0*cs%Flux_const)) * &
283 ((salin_restore - state%SSS(i,j)) / &
284 (0.5 * (salin_restore + state%SSS(i,j))))
289 call mom_error(fatal,
"User_buoyancy_surface_forcing: " // &
290 "Buoyancy restoring used without modification." )
293 buoy_rest_const = -1.0 * (cs%G_Earth * cs%Flux_const) / cs%Rho0
294 do j=js,je ;
do i=is,ie
297 density_restore = 1030.0
299 fluxes%buoy(i,j) = g%mask2dT(i,j) * buoy_rest_const * &
300 (density_restore - state%sfc_density(i,j))
Ocean grid type. See mom_grid for details.