1 module rgc_initialization
26 use mom_sponge,
only : set_up_sponge_ml_density
38 implicit none ;
private
40 #include <MOM_memory.h>
42 character(len=40) :: mod =
"RGC_initialization"
43 public rgc_initialize_sponges
50 subroutine rgc_initialize_sponges(G, GV, tv, u, v, PF, use_ALE, CSp, ACSp)
51 type(ocean_grid_type),
intent(in) :: G
52 type(verticalGrid_type),
intent(in) :: GV
53 type(thermo_var_ptrs),
intent(in) :: tv
58 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(in) :: u
59 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(in) :: v
60 type(param_file_type),
intent(in) :: PF
63 logical,
intent(in) :: use_ALE
64 type(sponge_CS),
pointer :: CSp
65 type(ALE_sponge_CS),
pointer :: ACSp
68 real :: T(SZI_(G),SZJ_(G),SZK_(G))
69 real :: S(SZI_(G),SZJ_(G),SZK_(G))
70 real :: U1(SZIB_(G), SZJ_(G), SZK_(G))
71 real :: V1(SZI_(G), SZJB_(G), SZK_(G))
72 real :: RHO(SZI_(G),SZJ_(G),SZK_(G))
73 real :: tmp(SZI_(G),SZJ_(G))
74 real :: h(SZI_(G),SZJ_(G),SZK_(G))
75 real :: Idamp(SZI_(G),SZJ_(G))
80 real :: eta(SZI_(G),SZJ_(G),SZK_(G)+1)
83 real :: min_depth, dummy1, z, delta_h
84 real :: damp, rho_dummy, min_thickness, rho_tmp, xi0
85 real :: lenlat, lenlon, lensponge
86 character(len=40) :: filename, state_file
87 character(len=40) :: temp_var, salt_var, eta_var, inputdir, h_var
89 character(len=40) :: mod =
"RGC_initialize_sponges"
90 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, iscB, iecB, jscB, jecB
92 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
93 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
94 iscb = g%iscB ; iecb = g%iecB; jscb = g%jscB ; jecb = g%jecB
96 call get_param(pf,mod,
"MIN_THICKNESS",min_thickness,
'Minimum layer thickness',units=
'm',default=1.e-3)
98 call get_param(pf, mod,
"RGC_TNUDG", tnudg,
'Nudging time scale for sponge layers (days)', default=0.0)
100 call get_param(pf, mod,
"LENLAT", lenlat, &
101 "The latitudinal or y-direction length of the domain", &
102 fail_if_missing=.true., do_not_log=.true.)
104 call get_param(pf, mod,
"LENLON", lenlon, &
105 "The longitudinal or x-direction length of the domain", &
106 fail_if_missing=.true., do_not_log=.true.)
108 call get_param(pf, mod,
"LENSPONGE", lensponge, &
109 "The length of the sponge layer (km).", &
112 call get_param(pf, mod,
"SPONGE_UV", sponge_uv, &
113 "Nudge velocities (u and v) towards zero in the sponge layer.", &
114 default=.false., do_not_log=.true.)
116 t(:,:,:) = 0.0 ; s(:,:,:) = 0.0 ; idamp(:,:) = 0.0; rho(:,:,:) = 0.0
118 call get_param(pf, mod,
"MINIMUM_DEPTH", min_depth, &
119 "The minimum depth of the ocean.", units=
"m", default=0.0)
121 if (
associated(csp))
call mom_error(fatal, &
122 "RGC_initialize_sponges called with an associated control structure.")
123 if (
associated(acsp))
call mom_error(fatal, &
124 "RGC_initialize_sponges called with an associated ALE-sponge control structure.")
131 do i=is,ie;
do j=js,je
132 if (g%geoLonT(i,j) <= lensponge)
then
133 dummy1 = -(g%geoLonT(i,j))/lensponge + 1.0
138 elseif (g%geoLonT(i,j) >= (lenlon - lensponge) .AND. g%geoLonT(i,j) <= lenlon)
then
141 dummy1=(g%geoLonT(i,j)-(lenlon - lensponge))/(lensponge)
142 damp = (1.0/tnudg) * max(0.0,dummy1)
148 if (g%bathyT(i,j) > min_depth)
then
149 idamp(i,j) = damp/86400.0
150 else ; idamp(i,j) = 0.0 ;
endif
155 call get_param(pf, mod,
"INPUTDIR", inputdir, default=
".")
156 inputdir = slasher(inputdir)
162 call get_param(pf, mod,
"RGC_SPONGE_FILE", state_file, &
163 "The name of the file with temps., salts. and interfaces to \n"// &
164 " damp toward.", fail_if_missing=.true.)
165 call get_param(pf, mod,
"SPONGE_PTEMP_VAR", temp_var, &
166 "The name of the potential temperature variable in \n"//&
167 "SPONGE_STATE_FILE.", default=
"Temp")
168 call get_param(pf, mod,
"SPONGE_SALT_VAR", salt_var, &
169 "The name of the salinity variable in \n"//&
170 "SPONGE_STATE_FILE.", default=
"Salt")
171 call get_param(pf, mod,
"SPONGE_ETA_VAR", eta_var, &
172 "The name of the interface height variable in \n"//&
173 "SPONGE_STATE_FILE.", default=
"eta")
174 call get_param(pf, mod,
"SPONGE_H_VAR", h_var, &
175 "The name of the layer thickness variable in \n"//&
176 "SPONGE_STATE_FILE.", default=
"h")
179 filename = trim(inputdir)//trim(state_file)
181 call mom_error(fatal,
" RGC_initialize_sponges: Unable to open "//trim(filename))
182 call read_data(filename,temp_var,t(:,:,:), domain=g%Domain%mpp_domain)
183 call read_data(filename,salt_var,s(:,:,:), domain=g%Domain%mpp_domain)
187 call read_data(filename,h_var,h(:,:,:), domain=g%Domain%mpp_domain)
194 if (
associated(tv%T) )
then
197 if (
associated(tv%S) )
then
202 u1(:,:,:) = 0.0; v1(:,:,:) = 0.0
210 call read_data(filename,eta_var,eta(:,:,:), domain=g%Domain%mpp_domain)
214 call initialize_sponge(idamp, eta, g, pf, csp, gv)
216 if ( gv%nkml>0 )
then
220 do i=is-1,ie ; pres(i) = tv%P_Ref ;
enddo
224 is, ie-is+1, tv%eqn_of_state)
227 call set_up_sponge_ml_density(tmp, g, csp)
231 call set_up_sponge_field(t, tv%T, g, nz, csp)
232 call set_up_sponge_field(s, tv%S, g, nz, csp)
236 end subroutine rgc_initialize_sponges
238 end module rgc_initialization