This subroutine applies damping to the layers thicknesses, temp, salt and a variety of tracers for every column where there is damping.
845 type(ocean_grid_type),
intent(inout) :: G
846 type(verticalGrid_type),
intent(in) :: GV
847 type(unit_scale_type),
intent(in) :: US
848 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
850 real,
intent(in) :: dt
851 type(ALE_sponge_CS),
pointer :: CS
853 type(time_type),
optional,
intent(in) :: Time
859 real,
allocatable,
dimension(:) :: tmp_val2
860 real,
dimension(SZK_(G)) :: tmp_val1
861 real :: hu(SZIB_(G), SZJ_(G), SZK_(G))
862 real :: hv(SZI_(G), SZJB_(G), SZK_(G))
863 real,
allocatable,
dimension(:,:,:) :: sp_val
864 real,
allocatable,
dimension(:,:,:) :: mask_z
865 integer :: c, m, nkmb, i, j, k, is, ie, js, je, nz, nz_data
866 real,
allocatable,
dimension(:),
target :: z_in, z_edges_in
867 real :: missing_value
868 real :: h_neglect, h_neglect_edge
870 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
872 if (.not.
associated(cs))
return
874 if (gv%Boussinesq)
then
875 h_neglect = gv%m_to_H*1.0e-30 ; h_neglect_edge = gv%m_to_H*1.0e-10
877 h_neglect = gv%kg_m2_to_H*1.0e-30 ; h_neglect_edge = gv%kg_m2_to_H*1.0e-10
880 if (cs%new_sponges)
then
881 if (.not.
present(time)) &
882 call mom_error(fatal,
"apply_ALE_sponge: No time information provided")
887 nz_data = cs%Ref_val(m)%nz_data
888 allocate(sp_val(g%isd:g%ied,g%jsd:g%jed,1:nz_data))
889 allocate(mask_z(g%isd:g%ied,g%jsd:g%jed,1:nz_data))
893 call horiz_interp_and_extrap_tracer(cs%Ref_val(cs%fldno)%id,time, 1.0,g,sp_val,mask_z,z_in,z_edges_in, &
894 missing_value,.true., .false.,.false., m_to_z=us%m_to_Z)
901 i = cs%col_i(c) ; j = cs%col_j(c)
902 cs%Ref_val(m)%p(1:nz_data,c) = sp_val(i,j,1:nz_data)
905 if (cs%Ref_val(m)%h(k,c) <= 0.001*gv%m_to_H) &
908 cs%Ref_val(m)%p(k,c) = cs%Ref_val(m)%p(k-1,c)
912 deallocate(sp_val, mask_z)
918 allocate(tmp_val2(nz_data))
924 i = cs%col_i(c) ; j = cs%col_j(c)
925 damp = dt*cs%Iresttime_col(c)
926 i1pdamp = 1.0 / (1.0 + damp)
927 tmp_val2(1:nz_data) = cs%Ref_val(m)%p(1:nz_data,c)
928 if (cs%new_sponges)
then
929 call remapping_core_h(cs%remap_cs, nz_data, cs%Ref_val(m)%h(1:nz_data,c), tmp_val2, &
930 cs%nz, h(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
932 call remapping_core_h(cs%remap_cs,nz_data, cs%Ref_h%p(1:nz_data,c), tmp_val2, &
933 cs%nz, h(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
936 cs%var(m)%p(i,j,1:cs%nz) = i1pdamp * (cs%var(m)%p(i,j,1:cs%nz) + tmp_val1 * damp)
948 if (cs%sponge_uv)
then
951 do j=cs%jsc,cs%jec;
do i=cs%iscB,cs%iecB;
do k=1,nz
952 hu(i,j,k) = 0.5 * (h(i,j,k) + h(i+1,j,k))
953 enddo ;
enddo ;
enddo
955 if (cs%new_sponges)
then
956 if (.not.
present(time)) &
957 call mom_error(fatal,
"apply_ALE_sponge: No time information provided")
959 nz_data = cs%Ref_val_u%nz_data
960 allocate(sp_val(g%isdB:g%iedB,g%jsd:g%jed,1:nz_data))
961 allocate(mask_z(g%isdB:g%iedB,g%jsd:g%jed,1:nz_data))
963 call horiz_interp_and_extrap_tracer(cs%Ref_val_u%id,time, 1.0,g,sp_val,mask_z,z_in,z_edges_in, &
964 missing_value, .true., .false., .false., m_to_z=us%m_to_Z)
972 i = cs%col_i(c) ; j = cs%col_j(c)
973 cs%Ref_val_u%p(1:nz_data,c) = sp_val(i,j,1:nz_data)
976 deallocate (sp_val, mask_z)
978 nz_data = cs%Ref_val_v%nz_data
979 allocate(sp_val(g%isd:g%ied,g%jsdB:g%jedB,1:nz_data))
980 allocate(mask_z(g%isd:g%ied,g%jsdB:g%jedB,1:nz_data))
982 call horiz_interp_and_extrap_tracer(cs%Ref_val_v%id,time, 1.0,g,sp_val,mask_z,z_in,z_edges_in, &
983 missing_value, .true., .false., .false., m_to_z=us%m_to_Z)
991 i = cs%col_i(c) ; j = cs%col_j(c)
992 cs%Ref_val_v%p(1:nz_data,c) = sp_val(i,j,1:nz_data)
995 deallocate (sp_val, mask_z)
1002 i = cs%col_i_u(c) ; j = cs%col_j_u(c)
1003 damp = dt*cs%Iresttime_col_u(c)
1004 i1pdamp = 1.0 / (1.0 + damp)
1005 if (cs%new_sponges) nz_data = cs%Ref_val(m)%nz_data
1006 tmp_val2(1:nz_data) = cs%Ref_val_u%p(1:nz_data,c)
1007 if (cs%new_sponges)
then
1008 call remapping_core_h(cs%remap_cs, nz_data, cs%Ref_val_u%h(:,c), tmp_val2, &
1009 cs%nz, hu(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
1011 call remapping_core_h(cs%remap_cs, nz_data, cs%Ref_hu%p(:,c), tmp_val2, &
1012 cs%nz, hu(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
1015 cs%var_u%p(i,j,:) = i1pdamp * (cs%var_u%p(i,j,:) + tmp_val1 * damp)
1019 do j=cs%jscB,cs%jecB;
do i=cs%isc,cs%iec;
do k=1,nz
1020 hv(i,j,k) = 0.5 * (h(i,j,k) + h(i,j+1,k))
1021 enddo ;
enddo ;
enddo
1024 i = cs%col_i_v(c) ; j = cs%col_j_v(c)
1025 damp = dt*cs%Iresttime_col_v(c)
1026 i1pdamp = 1.0 / (1.0 + damp)
1027 tmp_val2(1:nz_data) = cs%Ref_val_v%p(1:nz_data,c)
1028 if (cs%new_sponges)
then
1029 call remapping_core_h(cs%remap_cs, cs%nz_data, cs%Ref_val_v%h(:,c), tmp_val2, &
1030 cs%nz, hv(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
1032 call remapping_core_h(cs%remap_cs, cs%nz_data, cs%Ref_hv%p(:,c), tmp_val2, &
1033 cs%nz, hv(i,j,:), tmp_val1, h_neglect, h_neglect_edge)
1036 cs%var_v%p(i,j,:) = i1pdamp * (cs%var_v%p(i,j,:) + tmp_val1 * damp)
1041 deallocate(tmp_val2)